re PR middle-end/27743 (Wrong code for ((unsigned) ((a) >> 2)) >> 15)
authorRichard Guenther <rguenther@suse.de>
Thu, 25 May 2006 12:39:52 +0000 (12:39 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 25 May 2006 12:39:52 +0000 (12:39 +0000)
2006-05-25  Richard Guenther  <rguenther@suse.de>

PR middle-end/27743
* fold-const.c (fold_binary): Do not look at the stripped
op0 for (a OP c1) OP c2 to a OP (c1+c2) shift optimization.

* gcc.dg/torture/pr27743.c: New testcase.

From-SVN: r114112

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

index 64117ca1d5c2daf925c348d4bffc5e74c6de9034..368b3de9571c1511a5c4a5eeea5320f48af4df88 100644 (file)
@@ -1,3 +1,9 @@
+2006-05-25  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/27743
+       * fold-const.c (fold_binary): Do not look at the stripped
+       op0 for (a OP c1) OP c2 to a OP (c1+c2) shift optimization.
+
 2006-05-25  Eric Botcazou  <ebotcazou@adacore.com>
 
        * tree-vrp.c (extract_range_from_assert): Set the range to VARYING
index 8672e48f75676cc4747bb72848a30e0f0b6ef7cd..a5e57b18dfe6b18e4bf784a44dc4a77810112ae0 100644 (file)
@@ -9786,7 +9786,7 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
        return NULL_TREE;
 
       /* Turn (a OP c1) OP c2 into a OP (c1+c2).  */
-      if (TREE_CODE (arg0) == code && host_integerp (arg1, false)
+      if (TREE_CODE (op0) == code && host_integerp (arg1, false)
          && TREE_INT_CST_LOW (arg1) < TYPE_PRECISION (type)
          && host_integerp (TREE_OPERAND (arg0, 1), false)
          && TREE_INT_CST_LOW (TREE_OPERAND (arg0, 1)) < TYPE_PRECISION (type))
index 02de3f5f5d72895f062765ebc5c042aad55f696f..4e3a9b897ad7855144ceeecaa93b8f9a46bc0c78 100644 (file)
@@ -1,3 +1,8 @@
+2006-05-25  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/27743
+       * gcc.dg/torture/pr27743.c: New testcase.
+
 2006-05-25  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        * gfortran.dg/large_real_kind_form_io_2.f90: UnXFAIL on SPARC/Solaris.
diff --git a/gcc/testsuite/gcc.dg/torture/pr27743.c b/gcc/testsuite/gcc.dg/torture/pr27743.c
new file mode 100644 (file)
index 0000000..ee9144a
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do run } */
+
+extern void abort(void);
+
+int bar(int a)
+{
+  return ((unsigned) ((a) >> 2)) >> 15;
+}
+
+int main()
+{
+  if (bar (0xffff3000) != 0x1ffff)
+    abort ();
+  return 0;
+}