On Wed, Oct 14, 2020 at 11:49 AM Jakub Jelinek <[email protected]> wrote:
>
> On Wed, Oct 14, 2020 at 11:22:48AM +0200, Richard Biener wrote:
> > > + if (mode == CCCmode
> > > + && GET_CODE (XEXP (x, 0)) == NEG
> > > + && GET_CODE (XEXP (XEXP (x, 0), 0)) == GEU
> > > + && REG_P (XEXP (XEXP (XEXP (x, 0), 0), 0))
> > > + && (GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == CCCmode
> > > + || GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)) == CCmode)
> > > + && REGNO (XEXP (XEXP (XEXP (x, 0), 0), 0)) == FLAGS_REG
> > > + && XEXP (XEXP (XEXP (x, 0), 0), 1) == const0_rtx
> > > + && GET_CODE (XEXP (x, 1)) == LTU
> > > + && REG_P (XEXP (XEXP (x, 1), 0))
> > > + && (GET_MODE (XEXP (XEXP (x, 1), 0))
> > > + == GET_MODE (XEXP (XEXP (XEXP (x, 0), 0), 0)))
> > > + && REGNO (XEXP (XEXP (x, 1), 0)) == FLAGS_REG
> > > + && XEXP (XEXP (x, 1), 1) == const0_rtx)
> >
> > Meh ;) templates to the rescue?
> >
> > rtx_match < un<NEG, bin<GEU, reg, ..> > ().matches (x)
> >
> > and with fancy metaprogramming expand it to above? Not sure if it's easier
> > to read that way. Maybe
>
> It would certainly not match the style used elsewhere in the backend.
> >
> > rtx neg, geu;
> > if (mode == CCCmode
> > && (neg = XEXP (x, 0), GET_CODE (neg) == NEG)
> > && (geu = XEXP (neg, 0), GET_CODE (geu) == GEU)
> > ...
> >
> > or
> >
> > if (mode == CCCmode
> > && GET_CODE (neg = XEXP (x, 0)) == NEG
> >
> > thus some manual CSE and naming in this matching would help?
>
> Attached are two incremental patches, one just adds op0 and op1 for the
> COMPARE operand of all the costs COMPARE handling, which replaces all the
> XEXP (x, 0) with op0 and XEXP (x, 1) with op1, the other is that plus
> the geu you've suggested.
OK, so the visual appearance is not very much improved. I guess
the main issue is the checks do not "align" with a view of the expression
but I can't see how to improve that. When one actually looks at
the tests the CSEd vairants are easier to match-up and I'd pick the geu one.
Eventually intermixed comments would help the casual reader?
+ rtx geu;
/* (neg:CCC */
if (mode == CCCmode
+ && GET_CODE (op0) == NEG
/* (geu (reg:CC[C] cc) const0)) */
+ && GET_CODE (geu = XEXP (op0, 0)) == GEU
+ && REG_P (XEXP (geu, 0))
+ && (GET_MODE (XEXP (geu, 0)) == CCCmode
+ || GET_MODE (XEXP (geu, 0)) == CCmode)
+ && REGNO (XEXP (geu, 0)) == FLAGS_REG
+ && XEXP (geu, 1) == const0_rtx
/* (LTU (reg:CCCmode cc) const0)) */
+ && GET_CODE (op1) == LTU
+ && REG_P (XEXP (op1, 0))
+ && GET_MODE (XEXP (op1, 0)) == GET_MODE (XEXP (geu, 0))
+ && REGNO (XEXP (op1, 0)) == FLAGS_REG
+ && XEXP (op1, 1) == const0_rtx)
I'll leave the actual review to Uros of course.
Richard.
>
> Jakub