summaryrefslogtreecommitdiffstats
path: root/src/compiler/nir
diff options
context:
space:
mode:
authorBas Nieuwenhuizen <[email protected]>2018-04-22 19:05:19 +0200
committerDylan Baker <[email protected]>2018-04-27 10:11:58 -0700
commitd844b2a656fa7ae6db6dacf47f2b6f9a65f3bd80 (patch)
tree956e3806fe4b773c58985fe571fff92a2da09acb /src/compiler/nir
parenta8297472762e9f1a38b17813a62e51d81656c1f2 (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 <[email protected]> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106174 Reviewed-by: Timothy Arceri <[email protected]> (cherry picked from commit 0e945fdf23bac5a62c15edfcbfd9d6ac4eee592f)
Diffstat (limited to 'src/compiler/nir')
-rw-r--r--src/compiler/nir/nir_lower_returns.c7
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 3ea69e25204..9c4881112e3 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);