mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-04-21 03:20:40 +02:00
nir/deref: Rematerialize parents in rematerialize_derefs_in_use_blocks
When nir_rematerialize_derefs_in_use_blocks_impl was first written, I attempted to optimize things a bit by not bothering to re-materialize the sources of deref instructions figuring that the final caller would take care of that. However, in the case of more complex deref chains where the first link or two lives in block A and then another link and the load/store_deref intrinsic live in block B it doesn't work. The code in rematerialize_deref_in_block looks at the tail of the chain, sees that it's already in block B and skips it, not realizing that part of the chain also lives in block A. The easy solution here is to just rematerialize deref sources of deref instructions as well. This may potentially lead to a few more deref instructions being created by the conditions required for that to actually happen are fairly unlikely and, thanks to the caching, it's all linear time regardless. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=109603 Fixes:7d1d1208c2"nir: Add a small pass to rematerialize derefs per-block" Reviewed-by: Alejandro Piñeiro <apinheiro@igalia.com> (cherry picked from commit9e6a6ef0d4)
This commit is contained in:
parent
a9c0e146ef
commit
3545986962
1 changed files with 2 additions and 3 deletions
|
|
@ -490,10 +490,9 @@ nir_rematerialize_derefs_in_use_blocks_impl(nir_function_impl *impl)
|
|||
_mesa_hash_table_clear(state.cache, NULL);
|
||||
|
||||
nir_foreach_instr_safe(instr, block) {
|
||||
if (instr->type == nir_instr_type_deref) {
|
||||
nir_deref_instr_remove_if_unused(nir_instr_as_deref(instr));
|
||||
if (instr->type == nir_instr_type_deref &&
|
||||
nir_deref_instr_remove_if_unused(nir_instr_as_deref(instr)))
|
||||
continue;
|
||||
}
|
||||
|
||||
state.builder.cursor = nir_before_instr(instr);
|
||||
nir_foreach_src(instr, rematerialize_deref_src, &state);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue