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>
This commit is contained in:
parent
8328c64eb1
commit
0e945fdf23
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue