[Nouveau] [PATCH v2] nv50/ir: avoid messing up arg1 of PFETCH
Tobias Klausmann
tobias.johannes.klausmann at mni.thm.de
Sat May 23 18:53:40 PDT 2015
Reviewed-by: Tobias Klausmann <tobias.johannes.klausmann at mni.thm.de>
On 23.05.2015 18:56, Ilia Mirkin wrote:
> There can be scenarios where the "indirect" arg of a PFETCH becomes
> known, and so the code will attempt to propagate it. Use this
> opportunity to just fold it into the first argument, and prevent the
> load propagation pass from touching PFETCH further.
>
> This fixes gs-input-array-vec4-index-rd.shader_test and
> vs-output-array-vec4-index-wr-before-gs.shader_test on nvc0 at least.
>
> Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
> Cc: "10.5 10.6" <mesa-stable at lists.freedesktop.org>
> ---
>
> v1 -> v2:
> - redo final section of ConstantFolding::expr using a switch, per tobijk
>
> .../drivers/nouveau/codegen/nv50_ir_peephole.cpp | 20 ++++++++++++++++++--
> 1 file changed, 18 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
> index 72dd31e..b7fcd56 100644
> --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
> +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
> @@ -236,6 +236,9 @@ LoadPropagation::visit(BasicBlock *bb)
> if (i->op == OP_CALL) // calls have args as sources, they must be in regs
> continue;
>
> + if (i->op == OP_PFETCH) // pfetch expects arg1 to be a reg
> + continue;
> +
> if (i->srcExists(1))
> checkSwapSrc01(i);
>
> @@ -581,6 +584,11 @@ ConstantFolding::expr(Instruction *i,
> case OP_POPCNT:
> res.data.u32 = util_bitcount(a->data.u32 & b->data.u32);
> break;
> + case OP_PFETCH:
> + // The two arguments to pfetch are logically added together. Normally
> + // the second argument will not be constant, but that can happen.
> + res.data.u32 = a->data.u32 + b->data.u32;
> + break;
> default:
> return;
> }
> @@ -595,7 +603,9 @@ ConstantFolding::expr(Instruction *i,
>
> i->getSrc(0)->reg.data = res.data;
>
> - if (i->op == OP_MAD || i->op == OP_FMA) {
> + switch (i->op) {
> + case OP_MAD:
> + case OP_FMA: {
> i->op = OP_ADD;
>
> i->setSrc(1, i->getSrc(0));
> @@ -610,8 +620,14 @@ ConstantFolding::expr(Instruction *i,
> bld.setPosition(i, false);
> i->setSrc(1, bld.loadImm(NULL, res.data.u32));
> }
> - } else {
> + break;
> + }
> + case OP_PFETCH:
> + // Leave PFETCH alone... we just folded its 2 args into 1.
> + break;
> + default:
> i->op = i->saturate ? OP_SAT : OP_MOV; /* SAT handled by unary() */
> + break;
> }
> i->subOp = 0;
> }
More information about the Nouveau
mailing list