aboutsummaryrefslogtreecommitdiffstats
path: root/src/compiler
diff options
context:
space:
mode:
authorArcady Goldmints-Orlov <[email protected]>2020-04-16 16:28:12 -0500
committerMarge Bot <[email protected]>2020-04-19 02:54:08 +0000
commitec1b96fdc8bccaf2c1a4e1e3cca32b4aacbe4f7c (patch)
tree724b3952c00411c75b04acbe3ca1d78f7483801d /src/compiler
parent969aeb6a93aefd037b130e4b37f58043fef493c3 (diff)
nir: Lower returns correctly inside nested loops
Inside nested flow control, nir_lower_returns inserts predicated breaks in the outer block. However, it would omit doing this if the remainder of the outer block (after the inner block) was empty. This is not correct in the case of loops, as execution just wraps back around to the start of the loop, so this change doesn't skip the predication inside loops. Fixes: 79dec93ead6e (nir: Add return lowering pass) Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/2724 Reviewed-by: Jason Ekstrand <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4603>
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/nir/nir_lower_returns.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/compiler/nir/nir_lower_returns.c b/src/compiler/nir/nir_lower_returns.c
index e166a7cc32a..ecbbf43da3b 100644
--- a/src/compiler/nir/nir_lower_returns.c
+++ b/src/compiler/nir/nir_lower_returns.c
@@ -50,7 +50,7 @@ predicate_following(nir_cf_node *node, struct lower_returns_state *state)
nir_builder *b = &state->builder;
b->cursor = nir_after_cf_node_and_phis(node);
- if (nir_cursors_equal(b->cursor, nir_after_cf_list(state->cf_list)))
+ if (!state->loop && nir_cursors_equal(b->cursor, nir_after_cf_list(state->cf_list)))
return; /* Nothing to predicate */
assert(state->return_flag);