On Fri, Nov 04, 2016 at 01:54:20PM +0100, Richard Biener wrote:
> On Fri, Nov 4, 2016 at 12:08 PM, Dominik Vogt <v...@linux.vnet.ibm.com> wrote:
> > On Fri, Nov 04, 2016 at 09:47:26AM +0100, Richard Biener wrote:
> >> On Thu, Nov 3, 2016 at 4:03 PM, Dominik Vogt <v...@linux.vnet.ibm.com> 
> >> wrote:
> >> > Is VRP the right pass to do this optimisation or should a later
> >> > pass rather attempt to eliminate the new use of b_5 instead?  Uli
> >> > has brought up the idea a mini "sign extend elimination" pass that
> >> > checks if the result of a sign extend could be replaced by the
> >> > original quantity in all places, and if so, eliminate the ssa
> >> > name.  (I guess that won't help with the above code because l is
> >> > used also as a function argument.)  How could a sensible approach
> >> > to deal with the situation look like?
> >>
> >> We run into this kind of situation regularly and for general foldings
> >> in match.pd we settled with single_use () even though it is not perfect.
> >> Note the usual complaint is not extra extension instructions but
> >> the increase of register pressure.
> >>
> >> This is because it is hard to do better when you are doing local
> >> optimization.
> >>
> >> As for the question on whether VRP is the right pass to do this the
> >> answer is two-fold -- VRP has the most precise range information.
> >> But the folding itself should be moved to generic code and use
> >> get_range_info ().
> >
> > All right, is this a sensible approach then?
> 
> Yes.
> 
> >   1. Using has_single_use as in the experimental patch is good
> >      enough (provided further testing does not show serious
> >      regressions).
> 
> I'd approve that, yes.
> 
> >   2. Rip the whole top level if-block from simplify_cond_using_ranges().
> >   3. Translate that code to match.pd syntax.
> 
> Might be some work but yes, that's also desired (you'd lose the ability
> to emit the warnings though).

Could you give me a match-pd-hint please?  We now have something
like this:

 (simplify
  (cond (gt SSA_NAME@0 INTEGER_CST@1) @2 @3)
  (if (... many conditions ...)
   (cond (gt ... ...) @2 @3))

The generated code ends up in gimple_simplify_COND_EXPR, but when
gimple_simplify is actually called, it goes through the
GIMPLE_COND case and calls gimple_resimplify2(..., GT, ...) and
there it tries gimple_simplify_GT_EXPR(), peeling of the (cond
...), i.e. it never tries the generated code.

There is another pattern in match.pd that uses a (cond ...) as the
first operand, and I do not understand how this works.  Should we
just use "(gt SSA_NAME@0 INTEGER_CST@1)" as the first operand
instead, and wouldn't this pattern be too general that way?

Ciao

Dominik ^_^  ^_^

-- 

Dominik Vogt
IBM Germany

Reply via email to