diff options
-rw-r--r-- | src/gallium/drivers/freedreno/ir3/ir3_legalize.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_legalize.c b/src/gallium/drivers/freedreno/ir3/ir3_legalize.c index 9d443d72c33..239bfc28826 100644 --- a/src/gallium/drivers/freedreno/ir3/ir3_legalize.c +++ b/src/gallium/drivers/freedreno/ir3/ir3_legalize.c @@ -335,7 +335,22 @@ resolve_jump(struct ir3_instruction *instr) target = list_first_entry(&tblock->instr_list, struct ir3_instruction, node); - if ((!target) || (target->ip == (instr->ip + 1))) { + /* TODO maybe a less fragile way to do this. But we are expecting + * a pattern from sched_block() that looks like: + * + * br !p0.x, #else-block + * br p0.x, #if-block + * + * if the first branch target is +2, or if 2nd branch target is +1 + * then we can just drop the jump. + */ + unsigned next_block; + if (instr->cat0.inv == true) + next_block = 2; + else + next_block = 1; + + if ((!target) || (target->ip == (instr->ip + next_block))) { list_delinit(&instr->node); return true; } else { |