On Mon, Nov 4, 2024 at 4:52 PM Andrew MacLeod <amacl...@redhat.com> wrote:
>
>
> >
> >> Am 04.11.2024 um 16:32 schrieb Andrew MacLeod <amacl...@redhat.com>:
> >>
> >> 
> >>> On 11/4/24 10:27, Richard Biener wrote:
> >>>
> >>>>> Am 04.11.2024 um 16:01 schrieb Andrew MacLeod <amacl...@redhat.com>:
> >>>> The invert() range operation is not supported on values of either 
> >>>> VARYING or UNDEFINED.  Primarily this is because UNDEFINED has no type, 
> >>>> which makes it impossible to perform invert() twice on a value, and 
> >>>> produce that same value.  There were also times when it wasn't precisely 
> >>>> clear what the client expects when UNDEFINED or VARYING is inverted.. so 
> >>>> it is handled at the caller point.
> >>>>
> >>>> When processing switches, whenever we find the ranges for a particular 
> >>>> label, we invert that range, and intersect that inversion with the 
> >>>> current "default:" ranges to determine the default case.   In this 
> >>>> testcase, one label has all possible values, so the label was producing 
> >>>> VARYING.  inverting that value was causing a trap.
> >>>>
> >>>> This patch simple checks for VARYING and sets the default ranges to 
> >>>> UNDEFINED in this case.
> >>> Is that correct?  The VARYING is not necessarily precise so „the rest“ 
> >>> should be VARYING as well?  That said, I don’t think you can use invert 
> >>> and intersect to compute the default case range.
> >> The varying *is* precise. It only comes up with varying if all the precise 
> >> values on each edge unioned together  come out to varying.   in this case, 
> >> boolean true and false. proiduces varying, leaving nothing for the default 
> >> cause.
> > It never gets VARYING because too many incoming edges and thus 
> > conservatively merging subranges?  I would doubt ranger can do precise 
> > ranges this way.  1 and 5 are conservatively [1, 5] but the inversion does 
> > not include 2 and thus is not conservative.
> >
> > Richard
> >
> No, that does not happen,at least it should not.  If we have too many
> edges to process (-param=vrp-switch-limit=) , we do not process the
> switch at all.  The limit is because processing massive numbers of
> subranges can get expensive and ceases to be worthwhile after a while .
>
> we've generated the range for default this way since gcc12 at least.
> Default starts with VARYING, and as we process each edge, we add the
> ranges on the edge to the destination case, and remove those ranges from
> the default case  (hence invert and intersect).   At the end, the range
> for default contains all the ranges that do not reach a case label.

OK, so I looked and the important detail seems to be that we use int_range_max
which actually has no "max" number of sub-ranges but dynamically grows, allowing
for "exact" operation (assuming union and intersect never "give up" themselves).

Richard.

> Andrew
>

Reply via email to