[Mesa-dev] [PATCH 2/3] nv50/ir: optimize slct(b, c, set(a, 0)) to slct(b, c, a)

Karol Herbst kherbst at redhat.com
Sun Dec 16 10:17:40 UTC 2018


 for
On Sat, Dec 15, 2018 at 7:58 PM Ilia Mirkin <imirkin at alum.mit.edu> wrote:
>
> On Fri, Dec 14, 2018 at 6:12 PM Karol Herbst <kherbst at redhat.com> wrote:
> >
> > From: Karol Herbst <karolherbst at gmail.com>
> >
> > helps mainly feral ported games
> >
> > shader-db changes:
> > total instructions in shared programs     : 7614782 -> 7565661 (-0.65%)
> > total gprs used in shared programs        : 798045 -> 797213 (-0.10%)
> > total shared used in shared programs      : 639636 -> 639636 (0.00%)
> > total local used in shared programs       : 24648 -> 24648 (0.00%)
> > total bytes used in shared programs       : 81330696 -> 80806160 (-0.64%)
> >
> >                 local     shared        gpr       inst      bytes
> >     helped          0          0        701       7940       7940
> >       hurt          0          0         44          4          4
> >
> > Signed-off-by: Karol Herbst <kherbst at redhat.com>
> > ---
> >  .../nouveau/codegen/nv50_ir_peephole.cpp      | 47 +++++++++++++++++--
> >  1 file changed, 44 insertions(+), 3 deletions(-)
> >
> > diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
> > index a8bd4f868bf..37e9edc49f4 100644
> > --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
> > +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
> > @@ -1763,7 +1763,8 @@ private:
> >     bool tryADDToMADOrSAD(Instruction *, operation toOp);
> >     void handleMINMAX(Instruction *);
> >     void handleRCP(Instruction *);
> > -   void handleSLCT(Instruction *);
> > +   void handleSLCT(CmpInstruction *);
> > +   bool tryMergeSLCTSET(CmpInstruction *slct, CmpInstruction *set);
>
> SLCT_SET or SET_SLCT. Otherwise it all runs together.
>
> >     void handleLOGOP(Instruction *);
> >     void handleCVT_NEG(Instruction *);
> >     void handleCVT_CVT(Instruction *);
> > @@ -1956,8 +1957,12 @@ AlgebraicOpt::handleRCP(Instruction *rcp)
> >  }
> >
> >  void
> > -AlgebraicOpt::handleSLCT(Instruction *slct)
> > +AlgebraicOpt::handleSLCT(CmpInstruction *slct)
> >  {
> > +   Instruction *insn = slct->getSrc(2)->getInsn();
> > +   while(insn && insn->op == OP_SET && tryMergeSLCTSET(slct, insn->asCmp())) {
>
> while (
>
> > +      insn = slct->getSrc(2)->getInsn();
> > +   }
> >     if (slct->getSrc(2)->reg.file == FILE_IMMEDIATE) {
> >        if (slct->getSrc(2)->asImm()->compare(slct->asCmp()->setCond, 0.0f))
> >           slct->setSrc(0, slct->getSrc(1));
> > @@ -1970,6 +1975,42 @@ AlgebraicOpt::handleSLCT(Instruction *slct)
> >     slct->setSrc(2, NULL);
> >  }
> >
> > +bool
> > +AlgebraicOpt::tryMergeSLCTSET(CmpInstruction *slct, CmpInstruction *set)
> > +{
> > +   assert(slct->op == OP_SLCT && set->op == OP_SET);
> > +
> > +   if (typeSizeof(set->sType) != 4)
> > +      return false;
> > +
> > +   CondCode setCC = set->getCondition();
> > +   CondCode slctCC = slct->getCondition();
> > +   CondCode newCC = setCC;
> > +
> > +   if (slctCC != CC_NE && slctCC != CC_EQ)
> > +      return false;
> > +
> > +   ImmediateValue imm0;
> > +   int s;
> > +
> > +   if (set->src(0).getImmediate(imm0) && imm0.isInteger(0))
> > +      s = 1;
> > +   else if (set->src(1).getImmediate(imm0) && imm0.isInteger(0))
> > +      s = 0;
> > +   else
> > +      return false;
> > +
> > +   slct->setSrc(2, set->getSrc(s));
> > +   if (s)
> > +      newCC = reverseCondCode(newCC);
> > +   if (slctCC == CC_EQ)
> > +      newCC = inverseCondCode(newCC);
>
> While not wrong, this is all pretty confusing. I won't require it, but
> I'd like to encourage you to write a paragraph about the theory about
> wtf is going on here.

I think this isn't directly correct though. We can't just flip a CC_EQ
over to a CC_NE or vice versa for floats, it has to be CC_EQU <=>
CC_NE and CC_EQ <=> CC_NEU. Need to think about this a bit more
carefully. Which might also mean that whenever we use inverseCondCode
for fp operations could be incorrect.

>
> > +
> > +   slct->sType = set->sType;
> > +   slct->setCondition(newCC);
> > +   return true;
> > +}
> > +
> >  void
> >  AlgebraicOpt::handleLOGOP(Instruction *logop)
> >  {
> > @@ -2340,7 +2381,7 @@ AlgebraicOpt::visit(BasicBlock *bb)
> >           handleMINMAX(i);
> >           break;
> >        case OP_SLCT:
> > -         handleSLCT(i);
> > +         handleSLCT(i->asCmp());
> >           break;
> >        case OP_AND:
> >        case OP_OR:
> > --
> > 2.19.2
> >


More information about the mesa-dev mailing list