aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2007-11-16 21:34:39 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2007-11-16 21:34:39 +0000
commit5abe96858868a873bddbb41b4e32599daa6f385c (patch)
treea2048e1254f70d5a8f267c703cc73c6bd6733224
parentf6dfe2fc46ac63fafbfdd9c5a505e72e8fe2b861 (diff)
downloadgcc-5abe96858868a873bddbb41b4e32599daa6f385c.zip
gcc-5abe96858868a873bddbb41b4e32599daa6f385c.tar.gz
gcc-5abe96858868a873bddbb41b4e32599daa6f385c.tar.bz2
re PR middle-end/34030 (ICE in in compare_values_warnv, at tree-vrp.c:701)
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: r130238
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c36
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr34030.c8
4 files changed, 37 insertions, 18 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 007aff1..7bd0763 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
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-16 Richard Guenther <rguenther@suse.de>
+
PR tree-optimization/33870
* tree.h (struct tree_memory_tag): Add base_for_components flag.
(struct tree_struct_field_tag): Remove nesting_level field.
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 0d6524e..1057d26 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -11858,24 +11858,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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a2a1caa..5da0c1d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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-16 Paul Thomas <pault@gcc.gnu.org>
PR fortran/34008
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr34030.c b/gcc/testsuite/gcc.c-torture/compile/pr34030.c
new file mode 100644
index 0000000..f4f9e17
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr34030.c
@@ -0,0 +1,8 @@
+int myvar;
+
+int foo(int mynum)
+{
+ if ((((void *)0) == (myvar & ((1U<<0) << mynum))) && (mynum > 0))
+ return 1;
+ return 0;
+}