nir/opt_loop: rematerialize header block derefs in their use blocks

Otherwise, we could end up with phis of derefs.

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Georg Lehmann <dadschoorse@gmail.com>
Fixes: 6b4b044739 ("nir/opt_loop: add loop peeling optimization")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31324>
This commit is contained in:
Rhys Perry 2024-09-19 14:15:09 +01:00 committed by Marge Bot
parent 1421319dcf
commit 0484044b1a

View file

@ -410,6 +410,12 @@ opt_loop_peel_initial_break(nir_loop *loop)
/* We need LCSSA because we are going to wrap the loop into an IF. */
nir_convert_loop_to_lcssa(loop);
/* We can't lower some derefs to regs or create phis using them, so rematerialize them instead. */
nir_foreach_instr_safe(instr, header_block) {
if (instr->type == nir_instr_type_deref)
nir_rematerialize_deref_in_use_blocks(nir_instr_as_deref(instr));
}
/* Lower loop header and LCSSA-phis to regs. */
nir_lower_phis_to_regs_block(header_block);
nir_lower_ssa_defs_to_regs_block(header_block);