nv50/ir: fold shl + mul with immediates

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>
This commit is contained in:
Ilia Mirkin 2015-12-04 17:26:32 -05:00
parent abd326e81b
commit 0ef5c8ab74
1 changed files with 16 additions and 0 deletions

View 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;