re PR tree-optimization/66449 (ICE: in build2_stat, at tree.c:4376 with -O3)
authorBin Cheng <bin.cheng@arm.com>
Tue, 23 Jun 2015 02:27:49 +0000 (02:27 +0000)
committerBin Cheng <amker@gcc.gnu.org>
Tue, 23 Jun 2015 02:27:49 +0000 (02:27 +0000)
PR tree-optimization/66449
* tree-ssa-loop-niter.c (loop_exits_before_overflow): Use
POINTER_PLUS_EXPR for pointers.

gcc/testsuite
PR tree-optimization/66449
* gcc.dg/vect/pr66449.c: New test.

From-SVN: r224769

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr66449.c [new file with mode: 0644]
gcc/tree-ssa-loop-niter.c

index 540685bc3765e98e9c2da588a35bdced163fca99..cd7074e5f15a8c2d9d78c1ebf4e53a336d485c4f 100644 (file)
@@ -1,3 +1,9 @@
+2015-06-23  Bin Cheng  <bin.cheng@arm.com>
+
+       PR tree-optimization/66449
+       * tree-ssa-loop-niter.c (loop_exits_before_overflow): Use
+       POINTER_PLUS_EXPR for pointers.
+
 2015-06-23  Alan Modra  <amodra@gmail.com>
 
        * rtlanal.c (commutative_operand_precedence): Correct comments.
index fac610723d2a286d606cf63139523ca3e4076012..d5329af391ce4731629b8e29a33d102960d8d1c8 100644 (file)
@@ -1,3 +1,8 @@
+2015-06-23  Bin Cheng  <bin.cheng@arm.com>
+
+       PR tree-optimization/66449
+       * gcc.dg/vect/pr66449.c: New test.
+
 2015-06-22  Pierre-Marie de Rodat  <derodat@adacore.com>
 
        * g++.dg/other/dump-ada-spec-5.C: New test.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr66449.c b/gcc/testsuite/gcc.dg/tree-ssa/pr66449.c
new file mode 100644 (file)
index 0000000..986b3fb
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+void *fn1(void *p1, void *p2, long p3)
+{
+  long a = (long)p1, b = (long)p2, c = p3;
+
+  while (c)
+    {
+      int d = ((int *)b)[0];
+
+      c--;
+      ((char *)a)[0] = d;
+      a++;
+    }
+  return 0;
+}
+
index 213d72e3dc4af903b83a1fe84b9ab2f8bb23639f..855d32ceeb01dab8278ca37f55f67dcf92ec1451 100644 (file)
@@ -3888,7 +3888,12 @@ loop_exits_before_overflow (tree base, tree step,
 
           by proving the reverse conditions are false using loop's initial
           condition.  */
-       stepped = fold_build2 (PLUS_EXPR, TREE_TYPE (base), base, step);
+       if (POINTER_TYPE_P (TREE_TYPE (base)))
+         code = POINTER_PLUS_EXPR;
+       else
+         code = PLUS_EXPR;
+
+       stepped = fold_build2 (code, TREE_TYPE (base), base, step);
        if (operand_equal_p (stepped, civ->base, 0))
          {
            if (tree_int_cst_sign_bit (step))