[Mesa-dev] [PATCH 1/3] nv50/ir: optimize slct(b, c, set(a, 0)) to slct(b, c, a)
Karol Herbst
kherbst at redhat.com
Thu Jun 21 23:14:27 UTC 2018
From: Karol Herbst <karolherbst at gmail.com>
helps mainly feral ported games
shader-db changes:
total instructions in shared programs : 5751418 -> 5730139 (-0.37%)
total gprs used in shared programs : 664007 -> 663206 (-0.12%)
total shared used in shared programs : 548832 -> 548832 (0.00%)
total local used in shared programs : 20956 -> 20956 (0.00%)
total bytes used in shared programs : 61439848 -> 61212472 (-0.37%)
local shared gpr inst bytes
helped 0 0 673 3746 3746
hurt 0 0 49 8 8
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 39177bd044b..32c6f9ee7af 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
@@ -1664,7 +1664,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);
void handleLOGOP(Instruction *);
void handleCVT_NEG(Instruction *);
void handleCVT_CVT(Instruction *);
@@ -1847,8 +1848,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())) {
+ 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));
@@ -1861,6 +1866,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);
+
+ slct->sType = set->sType;
+ slct->setCondition(newCC);
+ return true;
+}
+
void
AlgebraicOpt::handleLOGOP(Instruction *logop)
{
@@ -2196,7 +2237,7 @@ AlgebraicOpt::visit(BasicBlock *bb)
handleMINMAX(i);
break;
case OP_SLCT:
- handleSLCT(i);
+ handleSLCT(i->asCmp());
break;
case OP_AND:
case OP_OR:
--
2.17.1
More information about the mesa-dev
mailing list