From: Karol Herbst <g...@karolherbst.de> helps some shaders in multiple games
total instructions in shared programs : 1922267 -> 1922121 (-0.01%) total gprs used in shared programs : 251878 -> 251878 (0.00%) total local used in shared programs : 5673 -> 5673 (0.00%) total bytes used in shared programs : 17625496 -> 17624144 (-0.01%) local gpr inst bytes helped 0 0 62 62 hurt 0 0 0 0 Signed-off-by: Karol Herbst <nouv...@karolherbst.de> --- .../drivers/nouveau/codegen/nv50_ir_peephole.cpp | 69 +++++++++++++--------- 1 file changed, 42 insertions(+), 27 deletions(-) diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp index bfec130..9c60ea1 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp @@ -2881,37 +2881,52 @@ NV50PostRaConstantFolding::visit(BasicBlock *bb) def = i->getSrc(1)->getInsn(); if (def && def->op == OP_SPLIT && typeSizeof(def->sType) == 4) def = def->getSrc(0)->getInsn(); - if (def && def->op == OP_MOV && def->src(0).getFile() == FILE_IMMEDIATE) { - vtmp = i->getSrc(1); - if (typeSizeof(i->sType) > 2) { - i->setSrc(1, def->getSrc(0)); - } else { - ImmediateValue val; - bool ret = def->src(0).getImmediate(val); - assert(ret); - if (typeSizeof(i->sType) == 2) { - if (i->getSrc(1)->reg.data.id & 1) - val.reg.data.u32 >>= 16; - val.reg.data.u32 &= 0xffff; - } - i->setSrc(1, new_ImmediateValue(bb->getProgram(), val.reg.data.u32)); - } + if (!(def && def->op == OP_MOV && def->src(0).getFile() == FILE_IMMEDIATE)) { + /* maybe we can swap it */ + def = i->getSrc(0)->getInsn(); + if (def && def->op == OP_SPLIT && typeSizeof(def->sType) == 4) + def = def->getSrc(0)->getInsn(); + if (!(def && def->op == OP_MOV && def->src(0).getFile() == FILE_IMMEDIATE)) + break; + + Value *tmpS = i->getSrc(0); + Modifier tmpM = i->src(0).mod; + + i->setSrc(0, i->getSrc(1)); + i->src(0).mod = i->src(1).mod; - /* There's no post-RA dead code elimination, so do it here - * XXX: if we add more code-removing post-RA passes, we might - * want to create a post-RA dead-code elim pass */ - if (post_ra_dead(vtmp->getInsn())) { - Value *src = vtmp->getInsn()->getSrc(0); - // Careful -- splits will have already been removed from the - // functions. Don't double-delete. - if (vtmp->getInsn()->bb) - delete_Instruction(prog, vtmp->getInsn()); - if (src->getInsn() && post_ra_dead(src->getInsn())) - delete_Instruction(prog, src->getInsn()); + i->setSrc(1, tmpS); + i->src(1).mod = tmpM; + } + + vtmp = i->getSrc(1); + if (typeSizeof(i->sType) > 2) { + i->setSrc(1, def->getSrc(0)); + } else { + ImmediateValue val; + bool ret = def->src(0).getImmediate(val); + assert(ret); + if (typeSizeof(i->sType) == 2) { + if (i->getSrc(1)->reg.data.id & 1) + val.reg.data.u32 >>= 16; + val.reg.data.u32 &= 0xffff; } + i->setSrc(1, new_ImmediateValue(bb->getProgram(), val.reg.data.u32)); + } - break; + /* There's no post-RA dead code elimination, so do it here + * XXX: if we add more code-removing post-RA passes, we might + * want to create a post-RA dead-code elim pass */ + if (post_ra_dead(vtmp->getInsn())) { + Value *src = vtmp->getInsn()->getSrc(0); + // Careful -- splits will have already been removed from the + // functions. Don't double-delete. + if (vtmp->getInsn()->bb) + delete_Instruction(prog, vtmp->getInsn()); + if (src->getInsn() && post_ra_dead(src->getInsn())) + delete_Instruction(prog, src->getInsn()); } + break; default: break; -- 2.7.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev