On 11/8/18 8:14 AM, Richard Biener wrote:
> On Thu, Nov 8, 2018 at 4:00 PM Aldy Hernandez <al...@redhat.com> wrote:
>>
>>
>>
>> On 11/8/18 9:56 AM, Richard Biener wrote:
>>> On Thu, Nov 8, 2018 at 3:54 PM Aldy Hernandez <al...@redhat.com> wrote:
>>>>
>>>>
>>>>
>>>> On 11/8/18 9:49 AM, Richard Biener wrote:
>>>>> On Thu, Nov 8, 2018 at 3:31 PM Aldy Hernandez <al...@redhat.com> wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>> On 11/8/18 9:24 AM, Richard Biener wrote:
>>>>>>> On Thu, Nov 8, 2018 at 1:17 PM Aldy Hernandez <al...@redhat.com> wrote:
>>>>>>>>
>>>>>>>> This one's rather obvious and does not depend on any get_range_info API
>>>>>>>> change.
>>>>>>>>
>>>>>>>> OK for trunk?
>>>>>>>
>>>>>>> Hmm, no - that's broken.  IIRC m_equiv are shared bitmaps if you
>>>>>>> do tem = *old_vr so you modify it in place with equiv_clear().
>>>>>>
>>>>>> Good point.
>>>>>>
>>>>>>>
>>>>>>> Thus, operator= should be really deleted or mapped to value_range::set()
>>>>>>> in which case tem = *old_vr would do useless bitmap allocation and
>>>>>>> copying that you then clear.
>>>>>>
>>>>>> Actually, I was thinking that perhaps the assignment and equality
>>>>>> operators should disregard the equivalence bitmap.  In this case, copy
>>>>>> everything EXCEPT the bitmap and set the resulting equivalence bitmap to
>>>>>> NULL.
>>>>>
>>>>> I think that's equally confusing.
>>>>
>>>> I don't think so.  When you ask whether range A and range B are equal,
>>>> you're almost always interested in the range itself, not the equivalence
>>>> table behind it.
>>>>
>>>> We could also get rid of the == operator and just provide:
>>>>
>>>>          bool equal_p(bool ignore_equivs);
>>>>
>>>> How does this sound?
>>>
>>> Good.
>>>
>>>>>
>>>>>> It's also annoying to use ::ignore_equivs_equal_p().  Since that seems
>>>>>> to be the predominant way of comparing ranges, perhaps it should be the
>>>>>> default.
>>>>>
>>>>> I think a good approach would be to isolate m_equiv more because it is
>>>>> really an implementation detail of the propagator.  Thus, make
>>>>>
>>>>> class value_range_with_equiv : public value_range
>>>>> {
>>>>> ... all the equiv stuff..
>>>>> }
>>>>>
>>>>> make the lattice of type value_range_with_equiv and see what tickles
>>>>> down.
>>>>>
>>>>> value_range_with_equiv wouldn't implement copy and assignment
>>>>> (too expensive) and value_range can do with the trivial implementation.
>>>>>
>>>>> And most consumers/workers can just work on the equiv-less variants.
>>>>
>>>> I like this.  Unfortunately, not feasible for this cycle (for me
>>>> anyhow-- patches welcome though :)).  How about equal_p() as described
>>>> above?
>>>
>>> Works for me but you still need to sort out the copying, so if you think
>>> splitting is not feasible (I'll give it a try) then please disable 
>>> assingment
>>> and copy operators and fixup code.
>>
>> Are you saying you'll try implementing value_range_with_equiv :
>> value_range?  That would be of great help!
> 
> Yes, I'll experiment with this.  Meanwhile noticed bogus
> 
>               /* We're going to need to unwind this range.  We can
>                  not use VR as that's a stack object.  We have to allocate
>                  a new range and push the old range onto the stack.  We
>                  also have to be very careful about sharing the underlying
>                  bitmaps.  Ugh.  */
>               value_range *new_vr = vr_values->allocate_value_range ();
>               *new_vr = vr;
>               new_vr->equiv_clear ();
I hate this hunk of code.  In fact, it's probably the biggest wart from
the classification & simplification work last year.

The problem is the local stack object can't be pushed onto the unwinding
stack -- it'll be destroyed when we leave scope and we end up popping
total junk later when we restore the range.

You also have to be careful because of the bitmap sharing.

Jeff

Reply via email to