[Mesa-dev] [PATCH v2 1/2] nv50/ir: handle SHLADD in IndirectPropagation
Karol Herbst
kherbst at redhat.com
Tue Jun 12 14:08:46 UTC 2018
this can potentially lead to worse code, but shladd is usually only
used in regards to load, and the shader-db result also states there
are no regressions. I would really like to be able to do certain ops
conditionally, but that's kind of a bigger project. Anyway...
Reviewed-by: Karol Herbst <kherbst at redhat.com>
On Tue, Jun 12, 2018 at 3:30 PM, Rhys Perry <pendingchaos02 at gmail.com> wrote:
> An alternative solution to the problem fixed in
> 0bd83d0 ("nv50/ir: move LateAlgebraicOpt to the very end").
>
> total instructions in shared programs : 5265148 -> 5264804 (-0.01%)
> total gprs used in shared programs : 624346 -> 624341 (-0.00%)
> total shared used in shared programs : 360704 -> 360704 (0.00%)
> total local used in shared programs : 20952 -> 20952 (0.00%)
>
> local shared gpr inst bytes
> helped 0 0 2 31 31
> hurt 0 0 0 0 0
>
> Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
> ---
> src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp | 12 ++++++++++++
> 1 file changed, 12 insertions(+)
>
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
> index 39177bd044..83fb15ca34 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
> @@ -283,6 +283,8 @@ class IndirectPropagation : public Pass
> {
> private:
> virtual bool visit(BasicBlock *);
> +
> + BuildUtil bld;
> };
>
> bool
> @@ -294,6 +296,8 @@ IndirectPropagation::visit(BasicBlock *bb)
> for (Instruction *i = bb->getEntry(); i; i = next) {
> next = i->next;
>
> + bld.setPosition(i, false);
> +
> for (int s = 0; i->srcExists(s); ++s) {
> Instruction *insn;
> ImmediateValue imm;
> @@ -325,6 +329,14 @@ IndirectPropagation::visit(BasicBlock *bb)
> i->setIndirect(s, 0, NULL);
> i->setSrc(s, cloneShallow(func, i->getSrc(s)));
> i->src(s).get()->reg.data.offset += imm.reg.data.u32;
> + } else if (insn->op == OP_SHLADD) {
> + if (!insn->src(2).getImmediate(imm) ||
> + !targ->insnCanLoadOffset(i, s, imm.reg.data.s32))
> + continue;
> + i->setIndirect(s, 0, bld.mkOp2v(
> + OP_SHL, TYPE_U32, bld.getSSA(), insn->getSrc(0), insn->getSrc(1)));
> + i->setSrc(s, cloneShallow(func, i->getSrc(s)));
> + i->src(s).get()->reg.data.offset += imm.reg.data.u32;
> }
> }
> }
> --
> 2.14.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list