On Tue, 15 Oct 2013, Richard Biener wrote: > > 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?
Actually the bug seems to be triggered by local patches in my tree that change get_computation_aff to better preserve original types ... So disregard this. Thanks, Richard. > Thanks, > Richard. > > 2013-10-15 Richard Biener <rguent...@suse.de> > > 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; > +} > -- Richard Biener <rguent...@suse.de> SUSE / SUSE Labs SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746 GF: Jeff Hawn, Jennifer Guild, Felix Imend