From a5c28fe07b2822866aaedfe94362918904bd8869 Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Mon, 15 Jan 2018 15:57:52 -0500 Subject: [PATCH] freedreno/ir3: be more clever with if/else jumps Try to clean up things like: br !p0.x #2 br p0.x #something to eliminate the first branch. Signed-off-by: Rob Clark --- .../drivers/freedreno/ir3/ir3_legalize.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) 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 { -- 2.30.2