[llvm-commits] [llvm-gcc-4.2] r57482 - /llvm-gcc-4.2/trunk/gcc/fold-const.c

Chris Lattner sabre at nondot.org
Mon Oct 13 23:58:18 PDT 2008


Author: lattner
Date: Tue Oct 14 01:58:18 2008
New Revision: 57482

URL: http://llvm.org/viewvc/llvm-project?rev=57482&view=rev
Log:
Fix a broken invariant in fold-const that caused it to infinitely recurse on the testcase
in PR2797.  It requires that nested folds be already folded on input.  It gets this right
in most places in fold_binary, but fails in these two places.  This makes the code 
consistent, which fixes the bug.  Yay for much head scratching.

Testcase here: llvm/FrontendC/2008-10-13-FrontendCrash.c


Modified:
    llvm-gcc-4.2/trunk/gcc/fold-const.c

Modified: llvm-gcc-4.2/trunk/gcc/fold-const.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/fold-const.c?rev=57482&r1=57481&r2=57482&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/fold-const.c (original)
+++ llvm-gcc-4.2/trunk/gcc/fold-const.c Tue Oct 14 01:58:18 2008
@@ -10571,12 +10571,12 @@
       /* bool_var != 1 becomes !bool_var. */
       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_onep (arg1)
           && code == NE_EXPR)
-        return fold_build1 (TRUTH_NOT_EXPR, type, arg0);
+        return fold_build1 (TRUTH_NOT_EXPR, type, fold_convert (type, arg0));
 
       /* bool_var == 0 becomes !bool_var. */
       if (TREE_CODE (TREE_TYPE (arg0)) == BOOLEAN_TYPE && integer_zerop (arg1)
           && code == EQ_EXPR)
-        return fold_build1 (TRUTH_NOT_EXPR, type, arg0);
+        return fold_build1 (TRUTH_NOT_EXPR, type, fold_convert (type, arg0));
 
       /*  ~a != C becomes a != ~C where C is a constant.  Likewise for ==.  */
       if (TREE_CODE (arg0) == BIT_NOT_EXPR





More information about the llvm-commits mailing list