summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorAlyssa Rosenzweig <[email protected]>2019-02-17 05:14:24 +0000
committerAlyssa Rosenzweig <[email protected]>2019-02-21 07:06:26 +0000
commit2c7470951764045a0f37876cc86daf7285d47a7c (patch)
treefe0af8ee3ced6d11761c3dc27a3017c09f725e98 /src/gallium
parent5e55c11a1b2a0cfe91fcf58785fabe1269f1c439 (diff)
panfrost/midgard: Fix nested/chained if-else
An if-else statement is compiled to a conditional branch (from the start to the second block) and an unconditional branch (from the end of the first block to the end of the else). We previously incorrectly computed the block index of the unconditional branch to be exactly one after that of the conditional branch, valid for a single if-else statement but nothing fancier. This patch correctly computes the unconditional branch target, fixing more complex if-else chains. Signed-off-by: Alyssa Rosenzweig <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/panfrost/midgard/midgard_compile.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/src/gallium/drivers/panfrost/midgard/midgard_compile.c b/src/gallium/drivers/panfrost/midgard/midgard_compile.c
index de9420685f5..bcd6bf151c1 100644
--- a/src/gallium/drivers/panfrost/midgard/midgard_compile.c
+++ b/src/gallium/drivers/panfrost/midgard/midgard_compile.c
@@ -3182,20 +3182,20 @@ emit_if(struct compiler_context *ctx, nir_if *nif)
int else_idx = ctx->block_count;
int count_in = ctx->instruction_count;
midgard_block *else_block = emit_cf_list(ctx, &nif->else_list);
+ int after_else_idx = ctx->block_count;
/* Now that we have the subblocks emitted, fix up the branches */
assert(then_block);
assert(else_block);
-
if (ctx->instruction_count == count_in) {
/* The else block is empty, so don't emit an exit jump */
mir_remove_instruction(then_exit);
- then_branch->branch.target_block = else_idx + 1;
+ then_branch->branch.target_block = after_else_idx;
} else {
then_branch->branch.target_block = else_idx;
- then_exit->branch.target_block = else_idx + 1;
+ then_exit->branch.target_block = after_else_idx;
}
}