This makes sure that we do not record a signed GIV that we do not
know whether it overflows or not. For the testcase IVOPTs else
can end up replacing an unsigned computation with a signed one.
Note that alternatively we may decide that it is not desirable
for SCEV to return signed { 2147483643, +, 1 } for this case
(ISTR adding that as feature ...). But I think that the
result, (int) { 2147483643, +, 1 } would not be a simple-iv
anymore.
Bootstrap and regtest pending on x86_64-unknown-linux-gnu.
Any opinions?
Thanks,
Richard.
2013-10-15 Richard Biener <[email protected]>
PR tree-optimization/58736
* tree-ssa-loop-ivopts.c (find_givs_in_stmt_scev): If this
is a GIV with undefined behavior on overflow make sure it
does not overflow before recording it.
* gcc.dg/torture/pr58736.c: New testcase.
Index: gcc/tree-ssa-loop-ivopts.c
===================================================================
--- gcc/tree-ssa-loop-ivopts.c (revision 203590)
+++ gcc/tree-ssa-loop-ivopts.c (working copy)
@@ -1084,6 +1084,13 @@ find_givs_in_stmt_scev (struct ivopts_da
if (!simple_iv (loop, loop_containing_stmt (stmt), lhs, iv, true))
return false;
+
+ /* If the induction variable invokes undefined behavior when it wraps
+ make sure it does not overflow. */
+ if (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (lhs))
+ && !iv->no_overflow)
+ return false;
+
iv->base = expand_simple_operations (iv->base);
if (contains_abnormal_ssa_name_p (iv->base)
Index: gcc/testsuite/gcc.dg/torture/pr58736.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/pr58736.c (revision 0)
+++ gcc/testsuite/gcc.dg/torture/pr58736.c (working copy)
@@ -0,0 +1,20 @@
+/* { dg-do run } */
+/* { dg-additional-options "-fstrict-overflow" } */
+
+int a, b, c, d, e;
+
+int
+main ()
+{
+ for (b = 4; b > -30; b--)
+ {
+ e = a > (int)((unsigned int) __INT_MAX__ - (unsigned int) b);
+ for (; c;)
+ for (;;)
+ {
+ if (d)
+ break;
+ }
+ }
+ return 0;
+}