re PR tree-optimization/53550 (ICE with -O{1,2,3} -fprefetch-loop-arrays in build2_st...
authorJakub Jelinek <jakub@redhat.com>
Mon, 4 Jun 2012 09:23:27 +0000 (11:23 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 4 Jun 2012 09:23:27 +0000 (11:23 +0200)
PR tree-optimization/53550
* tree-ssa-loop-niter.c (number_of_iterations_cond): If type
is POINTER_TYPE_P, use sizetype as step type instead of type.

* gcc.dg/pr53550.c: New test.

From-SVN: r188169

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

index d79f2a139f48f18074f1ddc8b14d471d047f811d..b94c8beaa677d7c505d4bab850d2114a9235c1fd 100644 (file)
@@ -1,3 +1,9 @@
+2012-06-04  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/53550
+       * tree-ssa-loop-niter.c (number_of_iterations_cond): If type
+       is POINTER_TYPE_P, use sizetype as step type instead of type.
+
 2012-06-04  Richard Guenther  <rguenther@suse.de>
 
        * tree-data-ref.c (have_similar_memory_accesses_1): Remove.
index 69019bfba5a7f30da0180ac43ebe224c653d8973..75b5be4f4cf49409d30ce5b7b69a8ff60052b657 100644 (file)
@@ -1,3 +1,8 @@
+2012-06-04  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/53550
+       * gcc.dg/pr53550.c: New test.
+
 2012-06-04  Richard Guenther  <rguenther@suse.de>
 
        * gcc.dg/tree-ssa/ldist-11.c: Enable -ftree-loop-distribute-patterns.
diff --git a/gcc/testsuite/gcc.dg/pr53550.c b/gcc/testsuite/gcc.dg/pr53550.c
new file mode 100644 (file)
index 0000000..1008f43
--- /dev/null
@@ -0,0 +1,12 @@
+/* PR tree-optimization/53550 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fprefetch-loop-arrays -w" } */
+
+int *
+foo (int *x)
+{
+  int *a = x + 10, *b = x, *c = a;
+  while (b != c)
+    *--c = *b++;
+  return x;
+}
index c7c4a15bef4d228ae9c1686986fcbaf069725444..501c431d4c8026756c665e1ce2ea44898334eb48 100644 (file)
@@ -1275,13 +1275,14 @@ number_of_iterations_cond (struct loop *loop,
      practice, but it is simple enough to manage.  */
   if (!integer_zerop (iv0->step) && !integer_zerop (iv1->step))
     {
+      tree step_type = POINTER_TYPE_P (type) ? sizetype : type;
       if (code != NE_EXPR)
        return false;
 
-      iv0->step = fold_binary_to_constant (MINUS_EXPR, type,
+      iv0->step = fold_binary_to_constant (MINUS_EXPR, step_type,
                                           iv0->step, iv1->step);
       iv0->no_overflow = false;
-      iv1->step = build_int_cst (type, 0);
+      iv1->step = build_int_cst (step_type, 0);
       iv1->no_overflow = true;
     }