nv50/ir: fold shl + mul with immediates
authorIlia Mirkin <imirkin@alum.mit.edu>
Fri, 4 Dec 2015 22:26:32 +0000 (17:26 -0500)
committerIlia Mirkin <imirkin@alum.mit.edu>
Sat, 5 Dec 2015 23:56:43 +0000 (18:56 -0500)
On SM20 this gives:

total instructions in shared programs : 6299222 -> 6294240 (-0.08%)
total gprs used in shared programs    : 944139 -> 944068 (-0.01%)
total local used in shared programs   : 54116 -> 54116 (0.00%)

                local        gpr       inst      bytes
    helped           0         126        2781        2781
      hurt           0          55          11          11

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp

index 0d74f725bd1caeaa2adbe4d942cbca9b9144a011..9f446280af8b5d6a326cc21471fb2e767fefdb7c 100644 (file)
@@ -1194,6 +1194,22 @@ ConstantFolding::opnd(Instruction *i, ImmediateValue &imm0, int s)
             i->setSrc(1, bld.loadImm(NULL, imm0.reg.data.u32 + imm1.reg.data.u32));
          }
          break;
+      case OP_MUL:
+         int muls;
+         if (isFloatType(si->dType))
+            return;
+         if (si->src(1).getImmediate(imm1))
+            muls = 1;
+         else if (si->src(0).getImmediate(imm1))
+            muls = 0;
+         else
+            return;
+
+         bld.setPosition(i, false);
+         i->op = OP_MUL;
+         i->setSrc(0, si->getSrc(!muls));
+         i->setSrc(1, bld.loadImm(NULL, imm1.reg.data.u32 << imm0.reg.data.u32));
+         break;
       case OP_SUB:
       case OP_ADD:
          int adds;