summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIlia Mirkin <[email protected]>2016-10-12 13:30:57 -0400
committerIlia Mirkin <[email protected]>2016-10-13 21:44:03 -0400
commita6d6eff2e6ea2ccd585fe9bf1e159979cd3047df (patch)
treed1cd07ce19c61e251860f77cebb97399a7f506d7
parent3a2869aacabc0021d757de0a6055e1e530d82e81 (diff)
nvc0/ir: be more careful about preserving modifiers in SHLADD creation
src2 was being given the wrong modifier, and we were not properly managing the modifier on the SHL source either. Signed-off-by: Ilia Mirkin <[email protected]> Reviewed-by: Samuel Pitoiset <[email protected]>
-rw-r--r--src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp12
1 files changed, 5 insertions, 7 deletions
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
index d88bb341746..737bda3ee33 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
@@ -2163,7 +2163,6 @@ LateAlgebraicOpt::tryADDToSHLADD(Instruction *add)
Value *src1 = add->getSrc(1);
ImmediateValue imm;
Instruction *shl;
- Modifier mod[2];
Value *src;
int s;
@@ -2182,20 +2181,19 @@ LateAlgebraicOpt::tryADDToSHLADD(Instruction *add)
src = add->getSrc(s);
shl = src->getUniqueInsn();
- if (shl->bb != add->bb || shl->usesFlags() || shl->subOp)
+ if (shl->bb != add->bb || shl->usesFlags() || shl->subOp || shl->src(0).mod)
return false;
if (!shl->src(1).getImmediate(imm))
return false;
- mod[0] = add->src(0).mod;
- mod[1] = add->src(1).mod;
-
add->op = OP_SHLADD;
add->setSrc(2, add->src(!s));
- add->src(2).mod = mod[s];
-
+ // SHL can't have any modifiers, but the ADD source may have had
+ // one. Preserve it.
add->setSrc(0, shl->getSrc(0));
+ if (s == 1)
+ add->src(0).mod = add->src(1).mod;
add->setSrc(1, new_ImmediateValue(shl->bb->getProgram(), imm.reg.data.u32));
add->src(1).mod = Modifier(0);