On Fri, Dec 09, 2016 at 08:32:01PM +0100, Dominik Vogt wrote:
> > >   This is a work in progress with the goal of fixing the first
> > >   problem and similar ones by calling simplify_set after
> > >   change_zero_ext to get rid of the overly complex code.  That
> > >   works fine in principle, but replaces back the (and (lshiftrt
> > >   ...) ...) that change_zero_ext generates back into zero_extract
> > >   form.  Fiddling with simplify_set and make_compound_operation* a
> > >   bit, trying to suppress undoing the transformations that
> > >   change_zero_ext has just done, resulted in the (unfinished)
> > >   patch.
> > 
> > This we cannot do: we cannot call simplify* here.  The problem is
> > combine can reuse the old target reg of an insn it combines but the
> > simplify* will still see the old nonzero_bits for that register.
> > 
> > The best solution to that is to not reuse registers at all, but that
> > will have to wait until GCC 8.
> > 
> > > As it's not clear to me whether this is a valid approach I'd
> > > appreciate any advice on the patch or alternative ways of doing
> > > that.
> > 
> > Currently I just handle all cases manually in change_zero_ext, but
> > that is not nice at all for your case.
> 
> You mean, inside change_zero_ext just look for for any "(and
> (subreg (zero_extract ...)))" where the zero_extract gets replaced
> later and the two and masks can be merged into one, and do that
> manually?  I'll try that.

You can also code those patterns (in your MD) as the zero_extract
form, if that works nicer?  This is for RNSBG, right, so you also
need to handles RXSBG and ROSBG, maybe you can do those in the
same pattern?


Segher

Reply via email to