]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/34030 (ICE in in compare_values_warnv, at tree-vrp.c:701)
authorRichard Guenther <rguenther@suse.de>
Fri, 16 Nov 2007 21:44:58 +0000 (21:44 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 16 Nov 2007 21:44:58 +0000 (21:44 +0000)
2007-11-16  Richard Guenther  <rguenther@suse.de>

PR middle-end/34030
* fold-const.c (fold_binary): Use correct types for folding
1 << X & Y to Y >> X & 1.

* gcc.c-torture/compile/pr34030.c: New testcase.

From-SVN: r130240

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr34030.c [new file with mode: 0644]

index 967505755773c1fa36ef767780b9fdc45fff6e28..17e62103e6da37581c2dd12ad95e63a8b3180aac 100644 (file)
@@ -1,3 +1,9 @@
+2007-11-16  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/34030
+       * fold-const.c (fold_binary): Use correct types for folding
+       1 << X & Y to Y >> X & 1.
+
 2007-11-08  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/32787
index d14a8e267970e24927a92913eef9b3d18cbc1831..b2a3fa6a314798d26fbd79c8a025ba8d31828155 100644 (file)
@@ -10643,24 +10643,24 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
          tree arg01 = TREE_OPERAND (arg0, 1);
          if (TREE_CODE (arg00) == LSHIFT_EXPR
              && integer_onep (TREE_OPERAND (arg00, 0)))
-           return
-             fold_build2 (code, type,
-                          build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
-                                  build2 (RSHIFT_EXPR, TREE_TYPE (arg00),
-                                          arg01, TREE_OPERAND (arg00, 1)),
-                                  fold_convert (TREE_TYPE (arg0),
-                                                integer_one_node)),
-                          arg1);
-         else if (TREE_CODE (TREE_OPERAND (arg0, 1)) == LSHIFT_EXPR
-                  && integer_onep (TREE_OPERAND (TREE_OPERAND (arg0, 1), 0)))
-           return
-             fold_build2 (code, type,
-                          build2 (BIT_AND_EXPR, TREE_TYPE (arg0),
-                                  build2 (RSHIFT_EXPR, TREE_TYPE (arg01),
-                                          arg00, TREE_OPERAND (arg01, 1)),
-                                  fold_convert (TREE_TYPE (arg0),
-                                                integer_one_node)),
-                          arg1);
+           {
+             tree tem = fold_build2 (RSHIFT_EXPR, TREE_TYPE (arg00),
+                                     arg01, TREE_OPERAND (arg00, 1));
+             tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0), tem,
+                                build_int_cst (TREE_TYPE (arg0), 1));
+             return fold_build2 (code, type,
+                                 fold_convert (TREE_TYPE (arg1), tem), arg1);
+           }
+         else if (TREE_CODE (arg01) == LSHIFT_EXPR
+                  && integer_onep (TREE_OPERAND (arg01, 0)))
+           {
+             tree tem = fold_build2 (RSHIFT_EXPR, TREE_TYPE (arg01),
+                                     arg00, TREE_OPERAND (arg01, 1));
+             tem = fold_build2 (BIT_AND_EXPR, TREE_TYPE (arg0), tem,
+                                build_int_cst (TREE_TYPE (arg0), 1));
+             return fold_build2 (code, type,
+                                 fold_convert (TREE_TYPE (arg1), tem), arg1);
+           }
        }
 
       /* If this is an NE or EQ comparison of zero against the result of a
index 38b8cdcf8d5bfa8a3e8cc91e01d33d1c67340586..71a148318fb21c77959bc10183c91b9bbd57af0d 100644 (file)
@@ -1,3 +1,8 @@
+2007-11-16  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/34030
+       * gcc.c-torture/compile/pr34030.c: New testcase.
+
 2007-11-07  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        * gcc.dg/out-of-bounds-1.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr34030.c b/gcc/testsuite/gcc.c-torture/compile/pr34030.c
new file mode 100644 (file)
index 0000000..f4f9e17
--- /dev/null
@@ -0,0 +1,8 @@
+int myvar;
+
+int foo(int mynum)
+{
+  if ((((void *)0) == (myvar & ((1U<<0) << mynum))) && (mynum > 0))
+    return 1;
+  return 0;
+}