[PATCH] Fix PR61482

Richard Biener rguenther@suse.de
Mon Jun 16 13:29:00 GMT 2014


On Mon, 16 Jun 2014, Richard Biener wrote:

> 
> The following fixes PR61482, avoiding to call set_value_range
> with [-INF(OVF), +INF(OVF)].
> 
> Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

Err, finger faster than eye.  Here's the changelog.

Richard.

2014-06-16  Richard Biener  <rguenther@suse.de>

        PR tree-optimization/61482
        * tree-vrp.c (adjust_range_with_scev): Avoid setting of
        [-INF(OVF), +INF(OVF)] range.

        * g++.dg/torture/pr61482.C: New testcase.


> Richard.
> 
> Index: gcc/tree-vrp.c
> ===================================================================
> --- gcc/tree-vrp.c	(revision 211698)
> +++ gcc/tree-vrp.c	(working copy)
> @@ -3892,15 +3892,6 @@ adjust_range_with_scev (value_range_t *v
>  	max = init;
>        else
>  	min = init;
> -
> -      /* If we would create an invalid range, then just assume we
> -	 know absolutely nothing.  This may be over-conservative,
> -	 but it's clearly safe, and should happen only in unreachable
> -         parts of code, or for invalid programs.  */
> -      if (compare_values (min, max) == 1)
> -	return;
> -
> -      set_value_range (vr, VR_RANGE, min, max, vr->equiv);
>      }
>    else if (vr->type == VR_RANGE)
>      {
> @@ -3933,16 +3924,20 @@ adjust_range_with_scev (value_range_t *v
>  	      || compare_values (tmax, max) == -1)
>  	    max = tmax;
>  	}
> +    }
> +  else
> +    return;
>  
> -      /* If we just created an invalid range with the minimum
> -	 greater than the maximum, we fail conservatively.
> -	 This should happen only in unreachable
> -	 parts of code, or for invalid programs.  */
> -      if (compare_values (min, max) == 1)
> -	return;
> +  /* If we just created an invalid range with the minimum
> +     greater than the maximum, we fail conservatively.
> +     This should happen only in unreachable
> +     parts of code, or for invalid programs.  */
> +  if (compare_values (min, max) == 1
> +      || (is_negative_overflow_infinity (min)
> +	  && is_positive_overflow_infinity (max)))
> +    return;
>  
> -      set_value_range (vr, VR_RANGE, min, max, vr->equiv);
> -    }
> +  set_value_range (vr, VR_RANGE, min, max, vr->equiv);
>  }
>  
>  
> Index: gcc/testsuite/g++.dg/torture/pr61482.C
> ===================================================================
> --- gcc/testsuite/g++.dg/torture/pr61482.C	(revision 0)
> +++ gcc/testsuite/g++.dg/torture/pr61482.C	(working copy)
> @@ -0,0 +1,29 @@
> +// { dg-do compile }
> +
> +class A
> +{
> +public:
> +    int m_fn1 ();
> +};
> +class B
> +{
> +  void m_fn2 (const int &p1);
> +  A mThebesLayerDataStack;
> +};
> +int b, c;
> +void B::m_fn2 (const int &p1)
> +{
> +  if (c && b)
> +    {
> +      int i;
> +      i = mThebesLayerDataStack.m_fn1 ();
> +      for (; i >= 0;)
> +	{
> +	  ++i;
> +	  break;
> +	}
> +      --i;
> +      for (; i >= 0; --i)
> +	mThebesLayerDataStack.m_fn1 ();
> +    }
> +}
> 

-- 
Richard Biener <rguenther@suse.de>
SUSE / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imend"orffer



More information about the Gcc-patches mailing list