OSDN Git Service

2012-01-03 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 3 Jan 2012 08:59:21 +0000 (08:59 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 3 Jan 2012 08:59:21 +0000 (08:59 +0000)
PR middle-end/51730
* fold-const.c (fold_comparison): Properly canonicalize
tree offset and HOST_WIDE_INT bit position.

* gcc.dg/fold-compare-6.c: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@182830 138bc75d-0d04-0410-961f-82ee72b054a4

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

index e9329b4..21533a3 100644 (file)
@@ -1,3 +1,9 @@
+2012-01-03  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/51730
+       * fold-const.c (fold_comparison): Properly canonicalize
+       tree offset and HOST_WIDE_INT bit position.
+
 2012-01-02  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/ia64/ia64.c (expand_vec_perm_broadcast): Use correct
index 5d3196b..b88b5d7 100644 (file)
@@ -8886,6 +8886,14 @@ fold_comparison (location_t loc, enum tree_code code, tree type,
              indirect_base0 = true;
            }
          offset0 = TREE_OPERAND (arg0, 1);
+         if (host_integerp (offset0, 0)
+             && ((HOST_WIDE_INT) (TREE_INT_CST_LOW (offset0) * BITS_PER_UNIT)
+                 / BITS_PER_UNIT
+                 == (HOST_WIDE_INT) TREE_INT_CST_LOW (offset0)))
+           {
+             bitpos0 = TREE_INT_CST_LOW (offset0) * BITS_PER_UNIT;
+             offset0 = NULL_TREE;
+           }
        }
 
       base1 = arg1;
@@ -8909,6 +8917,14 @@ fold_comparison (location_t loc, enum tree_code code, tree type,
              indirect_base1 = true;
            }
          offset1 = TREE_OPERAND (arg1, 1);
+         if (host_integerp (offset1, 0)
+             && ((HOST_WIDE_INT) (TREE_INT_CST_LOW (offset1) * BITS_PER_UNIT)
+                 / BITS_PER_UNIT
+                 == (HOST_WIDE_INT) TREE_INT_CST_LOW (offset1)))
+           {
+             bitpos1 = TREE_INT_CST_LOW (offset1) * BITS_PER_UNIT;
+             offset1 = NULL_TREE;
+           }
        }
 
       /* A local variable can never be pointed to by
index 8e84b3a..70a292b 100644 (file)
@@ -1,3 +1,8 @@
+2012-01-03  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/51730
+       * gcc.dg/fold-compare-6.c: New testcase.
+
 2012-01-03  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/51669
diff --git a/gcc/testsuite/gcc.dg/fold-compare-6.c b/gcc/testsuite/gcc.dg/fold-compare-6.c
new file mode 100644 (file)
index 0000000..7ddf6b4
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-fdump-tree-original" } */
+
+char digs[] = "0123456789";
+int foo (void)
+{
+  int xlcbug = 1 / (&(digs + 5)[-2 + (_Bool) 1] == &digs[4] ? 1 : -1);
+  return xlcbug;
+}
+
+/* { dg-final { scan-tree-dump "xlcbug = 1;" "original" } } */
+/* { dg-final { cleanup-tree-dump "original" } } */