nir: only override previous alu during loop analysis if supported
authorTimothy Arceri <tarceri@itsqueeze.com>
Tue, 19 Mar 2019 01:09:36 +0000 (12:09 +1100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Thu, 21 Mar 2019 10:51:21 +0000 (21:51 +1100)
Users of this function expect alu to be a supported comparision
if the induction variable is not NULL. Since we attempt to
override the return values if the first limit is not a const, we
must make sure we are dealing with a valid comparision before
overriding the alu instruction.

Fixes an unreachable in inverse_comparison() with the game
Assasins Creed Odyssey.

Fixes: 3235a942c16b ("nir: find induction/limit vars in iand instructions")
Acked-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=110216

src/compiler/nir/nir_loop_analyze.c

index c8304611b28cfd1beeea6242d4d08c15a072cc4c..cb71a55f2f177050e73ba0525ed291d80f3b75f6 100644 (file)
@@ -847,9 +847,11 @@ try_find_trip_count_vars_in_iand(nir_alu_instr **alu,
        !is_var_constant(*limit)) {
       src = iand->src[1].src.ssa;
       if (src->parent_instr->type == nir_instr_type_alu) {
-         *alu = nir_instr_as_alu(src->parent_instr);
-         if (is_supported_terminator_condition(*alu))
+         nir_alu_instr *tmp_alu = nir_instr_as_alu(src->parent_instr);
+         if (is_supported_terminator_condition(tmp_alu)) {
+            *alu = tmp_alu;
             *limit_rhs = get_induction_and_limit_vars(*alu, ind, limit, state);
+         }
       }
    }
 }