diff options
author | Arcady Goldmints-Orlov <[email protected]> | 2020-04-16 16:28:12 -0500 |
---|---|---|
committer | Marge Bot <[email protected]> | 2020-04-19 02:54:08 +0000 |
commit | ec1b96fdc8bccaf2c1a4e1e3cca32b4aacbe4f7c (patch) | |
tree | 724b3952c00411c75b04acbe3ca1d78f7483801d /src/compiler | |
parent | 969aeb6a93aefd037b130e4b37f58043fef493c3 (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.c | 2 |
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); |