re PR tree-optimization/49218 (Incorrect optimization of a 'for' loop creates an...
authorRichard Guenther <rguenther@suse.de>
Mon, 30 May 2011 11:15:20 +0000 (11:15 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 30 May 2011 11:15:20 +0000 (11:15 +0000)
2011-05-30  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/49218
* tree-vrp.c (adjust_range_with_scev): Properly check whether
overflow occured.

* gcc.c-torture/execute/pr49218.c: New testcase.

From-SVN: r174429

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr49218.c [new file with mode: 0644]
gcc/tree-vrp.c

index 55522d6d85efda519120e2eaafe685cb25f94663..e1d9f65508ddf35fe9fc93348b1db3d69ce9972c 100644 (file)
@@ -1,3 +1,9 @@
+2011-05-30  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/49218
+       * tree-vrp.c (adjust_range_with_scev): Properly check whether
+       overflow occured.
+
 2011-05-30  Richard Guenther  <rguenther@suse.de>
 
        * tree-ssa-forwprop.c (forward_propagate_into_comparison):
index 60230d8623bba236c112dd1f5e8a63c3ba33346e..2a504c75e9e9608cbb7665a0bb9221e545f8f23f 100644 (file)
@@ -1,3 +1,8 @@
+2011-05-30  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/49218
+       * gcc.c-torture/execute/pr49218.c: New testcase.
+
 2011-05-30  Ira Rosen  <ira.rosen@linaro.org>
 
        PR tree-optimization/49199
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr49218.c b/gcc/testsuite/gcc.c-torture/execute/pr49218.c
new file mode 100644 (file)
index 0000000..2fb18dd
--- /dev/null
@@ -0,0 +1,20 @@
+#ifdef __SIZEOF_INT128__
+typedef __int128 L;
+#else
+typedef long long L;
+#endif
+float f;
+
+int
+main ()
+{
+  L i = f;
+  if (i <= 10)
+    do
+      {
+       ++i;
+       asm ("");
+      }
+    while (i != 11);
+  return 0;
+}
index 8fcf629addecac26ba0e8ba1508321b3ee7c1a48..f40d0d4c89048dd3b45bd3c7f5a5667d03f861c1 100644 (file)
@@ -3423,11 +3423,17 @@ adjust_range_with_scev (value_range_t *vr, struct loop *loop,
                                            loop->nb_iterations_upper_bound,
                                            double_int_one),
                                        unsigned_p, &overflow);
-      tem = double_int_to_tree (TREE_TYPE (init), dtmp);
       /* If the multiplication overflowed we can't do a meaningful
-        adjustment.  */
-      if (!overflow && double_int_equal_p (dtmp, tree_to_double_int (tem)))
-       {
+        adjustment.  Likewise if the result doesn't fit in the type
+        of the induction variable.  For a signed type we have to
+        check whether the result has the expected signedness which
+        is that of the step as nb_iterations_upper_bound is unsigned.  */
+      if (!overflow
+         && double_int_fits_to_tree_p (TREE_TYPE (init), dtmp)
+         && (unsigned_p
+             || ((dtmp.high ^ TREE_INT_CST_HIGH (step)) >= 0)))
+       {
+         tem = double_int_to_tree (TREE_TYPE (init), dtmp);
          extract_range_from_binary_expr (&maxvr, PLUS_EXPR,
                                          TREE_TYPE (init), init, tem);
          /* Likewise if the addition did.  */