From cb51a93c1e85660307fc0575a7acc9e7c7dc320e Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Tue, 11 Jun 2024 16:23:12 +0100 Subject: [PATCH] nir/opt_loop: rematerialize derefs instead of creating phis Fixes NIR validation of hogwarts_legacy/00ac08423ad6e422. Reviewed-by: Timothy Arceri Signed-off-by: Rhys Perry Fixes: 9995f336e60c ("nir: add merge loop terminators optimisation") Part-of: --- src/compiler/nir/nir_opt_loop.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/compiler/nir/nir_opt_loop.c b/src/compiler/nir/nir_opt_loop.c index 51eca9fe6bb..1d8c2964ead 100644 --- a/src/compiler/nir/nir_opt_loop.c +++ b/src/compiler/nir/nir_opt_loop.c @@ -542,8 +542,12 @@ merge_terminators(nir_builder *b, nir_if *dest_if, nir_if *src_if) m_state.after_src_if = nir_after_cf_node(&src_if->cf_node); m_state.old_break_block = break_blk; m_state.continue_block = continue_blk_c.block; - nir_foreach_instr(instr, m_state.continue_block) { - nir_foreach_def(instr, insert_phis_after_terminator_merge, &m_state); + /* Use _safe because nir_rematerialize_deref_in_use_blocks might remove dead derefs. */ + nir_foreach_instr_reverse_safe(instr, m_state.continue_block) { + if (instr->type == nir_instr_type_deref) + nir_rematerialize_deref_in_use_blocks(nir_instr_as_deref(instr)); + else + nir_foreach_def(instr, insert_phis_after_terminator_merge, &m_state); } b->cursor = nir_before_src(&dest_if->condition);