On 06/04/2018 11:17 AM, Richard Biener wrote:

It wont be perfect however as many of those routines are written with the 
assumption that ranges are either a single range or an anti range. we no longer 
have that restriction and we will diverge in those cases.
But having 1 single range or N ranges isn't different when it comes to
the core working routines.  Because if you have N ranges it's simply
apply the op N times and union the result.  Yes - the special case is


now that OP (range) can result in multiple ranges but currently
all interesting cases you likely implement are simply covered by
returning either a range or an anti-range.  Because more generally
Yeah, This applies to most of the arithmetic operations in particular.   The range code indeed loops through the sub-ranges applying the operation to each one. And yes most cases do result in a single range, which is why it is ripe for sharing.  But we also aren't limited to it.  There are times where we can provide different results, such as with AND.  for signed char X: (X & 0xF0)    vrp produces   [-128, 112]  because it has to be a range or an anti range, and has to include 0.   with the 3 ranges we use right now, we generate  [-128, -16][0, 0][16, 112] Even with 2 ranges, we could generate [-128,0][16,112]  (or [-128,-16][0,112]) , both of which are somewhat better.

And we can also do better in cases when ranges are combined, like
     if (x != 20 && x != 30) by producing  [-128, 19][21, 29][31, 127] signed char
you'd not want N ranges but some affine thing so you can handle even
more cases without blowing up storage.
Why don't we want N ranges?    when we exceed the  number of supported ranges in irange, it simply starts merging ranges.  In the AND example with 3 sub-ranges supported,  we produce [-128, -16][0, 0][16, 112] .  If we try to add more sub-ranges than are supported, it simply starts merging them.  If we only supported 2 ranges instead of 3, the AND code would end up producing [-128,0][16,112]  or [-128,-16][0,112].  both of which are correct, just not as precise as if irange supported more. Class irange takes care of managing the storage and exact number of ranges, so none of the code in range-ops changes to deal with this.. it is just works on whatever it is given to produce the best result it can.

Extricating the code from the symbolic handling is also not straightforward 
some times as there are big switches which mix and match various bits of each 
case.
Yes.  Which is why I never really got far with dumping the symbolic
stuff because it's hard to come up with a replacement.  I guess
in reality you want to model symbolic ranges as constraints on affine
expressions and then have some constraint solver to
answer queries -- at least for symbolic ranges the interesting
transforms involve comparison simplifications (aka jump threading)
only.

Yeah its not trivial. The model I'm pursuing tracks  the symbolic relationships separately from the range constraints. It can use the range constraints if they are useful, but only if they help.

It focuses on the relationships between symbols generated by statements and combines sequentially encountered relationships together to determine a new relationship and make decisions.  And yes those are primarily are comparison points where we'll try to simplify the condition.

for instance
  i = j + 1
  if (i == j)

we don't need a range for 'i' or 'j' to determine this is never true, the relationship established in i = j + 1  is either (i != j) or (i < j) depending on the type and range of 'i' or 'j'.  Either result applied to the following (i == j) relationship makes it clear that the second condition can never be true.  We'll do it in the reverse order like the rangers current model...see the condition, decide it merits looking at for simplification, and look back to see if there are any relationships feeding it which can simplify it.

Anyway, thats the general direction I'm working in to resolve that set of problems.  And I plan to  integrate it with a copy/cast tracker which will allow us to see through copies and "equivalent" equivalencies so we don't get tricked :-)



Anyway, the "lateness" of he introduction is purely on me.  I like to get 
things working before talking about them especially when they start with half baked ideas.
I would have liked to see factoring out from current code first and
actually enhancing the current value-range represenation by removing
the
restriction on single ranges.

we started with something like that in mind, but the presence of symbolics embedded in the range made it incredibly awkward to add support for non-single ranges to the existing representation.

Factoring out the constant bounds aspects of the code is what Aldy is currently working on.  When he's finished the existing functions should contain just the symbolic processing part of the code, and they will call a common base to handle the constant bounds cases.


  I don't very much believe in the "start from scratch" approach.
Because history shows we always end up with both, the old and the new
afterwards.

I will try very, very hard to make sure we don't get stuck with both.
Think of it this way... this is a path to being able to hand off all range and vrp-related problems to someone else :-)

Andrew

PS. I tried manually overriding thunderbird settings on this to make this plain text. Hope it worked :-P.

Reply via email to