freedreno/ir3: avoid fan-in sources referring to same instruction

Since the RA has to be done s.t. each one gets its own (adjacent)
register, it would complicate matters if instructions were allowed to be
repeated. This enables copy-propagation use in situations where
previously that might have happened.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: Rob Clark <robclark@freedesktop.org>
This commit is contained in:
Ilia Mirkin 2014-09-30 23:27:25 -04:00 committed by Rob Clark
parent f5eeb8a6dc
commit 3dd9a0d6fd
1 changed files with 10 additions and 2 deletions

View File

@ -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;
}
}