[Mesa-dev] [PATCH 2/6] nv50/ir: swap sources in PostRaConstantFolding when src0 is imm

Ilia Mirkin imirkin at alum.mit.edu
Mon Jan 25 19:53:06 PST 2016


On Mon, Jan 25, 2016 at 9:57 AM, Karol Herbst <nouveau at karolherbst.de> wrote:
> From: Karol Herbst <git at 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 <nouveau at 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) {

This is a lot of diff of some very subtle code. But really what you want is

if (!def || def->op != MOV || !immediate) {
  see if doing the swap is beneficial, do it, and reset def
}

and then the rest of the code remains the same. Right?

> -            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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list