summaryrefslogtreecommitdiffstats
path: root/src/compiler/nir/nir_loop_analyze.c
diff options
context:
space:
mode:
authorTimothy Arceri <[email protected]>2019-03-19 12:09:36 +1100
committerTimothy Arceri <[email protected]>2019-03-21 21:51:21 +1100
commit427a6fee439b2df96edc813c56572169385772a6 (patch)
tree332698d3618c2e091f0a89f3f386639bce080b6f /src/compiler/nir/nir_loop_analyze.c
parent6d0a7f798c7f3de5c35b5ab3f2006a50f49f79b5 (diff)
nir: only override previous alu during loop analysis if supported
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 <[email protected]> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=110216
Diffstat (limited to 'src/compiler/nir/nir_loop_analyze.c')
-rw-r--r--src/compiler/nir/nir_loop_analyze.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/compiler/nir/nir_loop_analyze.c b/src/compiler/nir/nir_loop_analyze.c
index c8304611b28..cb71a55f2f1 100644
--- a/src/compiler/nir/nir_loop_analyze.c
+++ b/src/compiler/nir/nir_loop_analyze.c
@@ -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);
+ }
}
}
}