nir: fix GCM when GVN enabled
authorTimothy Arceri <tarceri@itsqueeze.com>
Fri, 6 Aug 2021 13:39:06 +0000 (23:39 +1000)
committerMarge Bot <eric+marge@anholt.net>
Tue, 17 Aug 2021 03:15:49 +0000 (03:15 +0000)
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 <timur.kristof@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12242>

src/compiler/nir/nir_opt_gcm.c

index f7d46a7..853b630 100644 (file)
@@ -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;