From edfcc4f0227322fd8f2d72fcf68c96e23b52ba01 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Fri, 6 Aug 2021 23:39:06 +1000 Subject: [PATCH] nir: fix GCM when GVN enabled MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Enabling GVN uncovered a bug where we would crash if the pass thinking about pushing something into a loop. Fixes: 6538b3e56614 ("nir: add heuristic for instructions in loops with GCM") Acked-by: Timur Kristóf Part-of: --- src/compiler/nir/nir_opt_gcm.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/compiler/nir/nir_opt_gcm.c b/src/compiler/nir/nir_opt_gcm.c index f7d46a701ee..853b630b224 100644 --- a/src/compiler/nir/nir_opt_gcm.c +++ b/src/compiler/nir/nir_opt_gcm.c @@ -395,6 +395,13 @@ static bool set_block_for_loop_instr(struct gcm_state *state, nir_instr *instr, nir_block *block) { + /* If the instruction wasn't in a loop to begin with we don't want to push + * it down into one. + */ + nir_loop *loop = state->blocks[instr->block->index].loop; + if (loop == NULL) + return true; + if (nir_block_dominates(instr->block, block)) return true; @@ -402,7 +409,6 @@ set_block_for_loop_instr(struct gcm_state *state, nir_instr *instr, * do{ ... break; } while(true) * Don't move the instruction as it will not help anything. */ - nir_loop *loop = state->blocks[instr->block->index].loop; if (loop->info->limiting_terminator == NULL && !loop->info->complex_loop && nir_block_ends_in_break(nir_loop_last_block(loop))) return false;