summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/drivers/freedreno/ir3/ir3_cp.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_cp.c b/src/gallium/drivers/freedreno/ir3/ir3_cp.c
index 73c2a27c6eb..83bcb7a742b 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_cp.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_cp.c
@@ -70,7 +70,7 @@ static void walk_children(struct ir3_instruction *instr, bool keep)
static struct ir3_instruction *
instr_cp_fanin(struct ir3_instruction *instr)
{
- unsigned i;
+ unsigned i, j;
/* we need to handle fanin specially, to detect cases
* when we need to keep a mov
@@ -92,7 +92,15 @@ instr_cp_fanin(struct ir3_instruction *instr)
if (is_meta(cand) && (cand->opc == OPC_META_FO))
cand = instr_cp(src->instr, true);
- src->instr = cand;
+ /* we can't have 2 registers referring to the same instruction, so
+ * go through and check if any already refer to the candidate
+ * instruction. if so, don't do the propagation.
+ */
+ for (j = 1; j < instr->regs_count; j++)
+ if (instr->regs[j]->instr == cand)
+ break;
+ if (j == instr->regs_count)
+ src->instr = cand;
}
}