diff options
author | Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> | 2018-04-22 19:05:19 +0200 |
---|---|---|
committer | Dylan Baker <dylan@pnwbakers.com> | 2018-04-26 10:46:18 -0700 |
commit | 7dfb6e73f6a9e562b3759b033e5707dd2bb8ced4 (patch) | |
tree | c5f925524c684dd18647e009f20d86721414125c | |
parent | 0ce18e6710a7b4f6599175084b58cea25335409e (diff) |
nir: Do not use progress for unreachable code in return lowering.
We seem to use progress for two cases:
1) When we lowered some returns.
2) When we remove unreachable code.
If just case 2 happens we assert as state->return_flag has not
been allocated yet, but we are still trying to do insert all
predicates based on it.
This splits the concerns. We only use progress internally for case 1
and then keep track of 2 in a separate variable to indicate progress
in the return value of the pass.
This is slightly better than transforming the assert into
if (!state->return_flag) return, as the solution in this patch avoids
inserting predicates even if some other part of the might need them.
Fixes: 6e22ad6edc "nir: return early when lowering a return at the end of a function"
CC: 18.1 <mesa-stable@lists.freedesktop.org>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106174
Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
(cherry picked from commit 0e945fdf23bac5a62c15edfcbfd9d6ac4eee592f)
-rw-r--r-- | src/compiler/nir/nir_lower_returns.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/compiler/nir/nir_lower_returns.c b/src/compiler/nir/nir_lower_returns.c index 3ea69e2520..9c4881112e 100644 --- a/src/compiler/nir/nir_lower_returns.c +++ b/src/compiler/nir/nir_lower_returns.c @@ -37,6 +37,8 @@ struct lower_returns_state { * needs to be predicated on the return flag variable. */ bool has_predicated_return; + + bool removed_unreachable_code; }; static bool lower_returns_in_cf_list(struct exec_list *cf_list, @@ -162,8 +164,9 @@ lower_returns_in_block(nir_block *block, struct lower_returns_state *state) */ return false; } else { + state->removed_unreachable_code = true; nir_cf_delete(&list); - return true; + return false; } } @@ -262,9 +265,11 @@ nir_lower_returns_impl(nir_function_impl *impl) state.loop = NULL; state.return_flag = NULL; state.has_predicated_return = false; + state.removed_unreachable_code = false; nir_builder_init(&state.builder, impl); bool progress = lower_returns_in_cf_list(&impl->body, &state); + progress = progress || state.removed_unreachable_code; if (progress) { nir_metadata_preserve(impl, nir_metadata_none); |