freedreno/ir3: deal with duplicate phi sources
Otherwise we end up with funny things like: mov.f32f32 r0.x, r1.y mov.f32f32 r0.x, r1.y (It doesn't happen as much after fixing the problem w/ CP into phi src, but it can still happen since we aren't too clever about generating phi sources in the first place.) Signed-off-by: Rob Clark <robclark@freedesktop.org>
This commit is contained in:
@@ -627,13 +627,28 @@ sched_insert_parallel_copies(struct ir3_block *block)
|
||||
{
|
||||
list_for_each_entry (struct ir3_instruction, instr, &block->instr_list, node) {
|
||||
if (instr->opc == OPC_META_PHI) {
|
||||
struct ir3_register *reg;
|
||||
struct ir3_register *reg, *reg2;
|
||||
foreach_src(reg, instr) {
|
||||
struct ir3_instruction *src = reg->instr;
|
||||
struct ir3_instruction *mov =
|
||||
ir3_MOV(src->block, src, TYPE_U32);
|
||||
mov->regs[0]->flags |= IR3_REG_PHI_SRC;
|
||||
mov->regs[0]->instr = instr;
|
||||
struct ir3_instruction *mov = NULL;
|
||||
|
||||
/* after CP we could end up w/ duplicate phi srcs: */
|
||||
foreach_src(reg2, instr) {
|
||||
if (reg == reg2)
|
||||
break;
|
||||
/* reg2 is before reg1 so already an inserted mov: */
|
||||
else if (reg2->instr->regs[1]->instr == src) {
|
||||
mov = reg2->instr;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!mov) {
|
||||
mov = ir3_MOV(src->block, src, TYPE_U32);
|
||||
mov->regs[0]->flags |= IR3_REG_PHI_SRC;
|
||||
mov->regs[0]->instr = instr;
|
||||
}
|
||||
|
||||
reg->instr = mov;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user