[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