[PATCH] Fix IVOPTs introducing undefined signed overflow
Richard Biener
rguenther@suse.de
Tue Oct 15 12:45:00 GMT 2013
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 <rguenther@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 <rguenther@suse.de>
SUSE / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imend
More information about the Gcc-patches
mailing list