https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105086

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Andrew Macleod from comment #2)
> Ranger VRP doesn't simulate edges the same way VRP does. It looks like VRP
> simulates the back edge twice and the second time notes that the MAX value
> is greater than it was before and "projects" the max to +INF to avoid
> further simulations and thus executing every instance of the loop. 

VRP uses optimistic SSA propagation with iteration, to avoid compile-time
explosion we do not simulate IV ranges growing [0,0] -> [0, 1] ->...-> [0, n]
but instead do the cited projection and rely on SCEV to improve the
resulting range.

> This allows it to refine the range in the loop better, which ranger VRP
> isn't doing as it is still doing a DOM walk and doesn't revisit the node.
> ANd I haven't added any sort of similar "projection" logic to the back edge
> processing.

I think ranger simply doesn't simulate SCCs (but I think that's OK)

> I have an alternate question.  it looks like when we utilize scev to pick up
> ranges we just give up if scev_probably_wraps_p() is true.
> 
> Analyzing # of iterations of loop 1
>   exit condition 1 < [4294967273, + , 1]
>   bounds on difference of bases: 4294967272 ... 4294967272
>   result:
>     # of iterations 23, bounded by 23
> 
> Statement (exit)if (a_1 > 1)
> is executed at most 23 (bounded by 23) + 1 times in loop 1.
> 
> but we neglect to create range for the PHI. We should be able to properly
> create a  range for this from the SCEV info rather than giving up?  It would
> be [0,0][4294967273, 4294967295]. 

Well, we give up if the IV wraps because then the logic we have to compute
the IV range doesn't work.  I'm talking about bounds_of_var_in_loop
which basically computes the range as [base, base + step * niter] with
adjustments to create proper ranges for negative step.

> And even with the old value_range we could use anti-range and produce
> ~[1, 4294967272]?

It should use the range as computed by the "iteration", just not use
SCEV to refine it.

> Is there a practical reason we don't look any closer at wrap cases to see if
> they are "simple wraps" or not?  I think that would also solve this issue.

The only reason is that nobody implemented it.  The important thing is to
compute that it will wrap exactly once of course.

Reply via email to