Patches welcome!

On Fri, Nov 9, 2018, 12:30 Richard Biener <richard.guent...@gmail.com wrote:

> On Thu, Nov 8, 2018 at 4:27 PM Jeff Law <l...@redhat.com> wrote:
> >
> > 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.
>
> _And_ the abstracted "allocator" doesn't allow initialization.  _And_
> the ->set methods are private.
>
> Bummer.
>
> Stupid C++.
>
> Richard.
>
> >
> > Jeff
>

Reply via email to