From 58d6243f625d61f08652aeadc9f25cfe42f21e13 Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Tue, 18 Feb 2025 12:26:59 +0100 Subject: [PATCH] nir/peephole_select: support demote for non CF HW MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Daniel Schürmann Reviewed-by: Alyssa Rosenzweig Part-of: --- src/compiler/nir/nir_opt_peephole_select.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/compiler/nir/nir_opt_peephole_select.c b/src/compiler/nir/nir_opt_peephole_select.c index e6422214379..db60025da26 100644 --- a/src/compiler/nir/nir_opt_peephole_select.c +++ b/src/compiler/nir/nir_opt_peephole_select.c @@ -80,10 +80,12 @@ block_check_for_allowed_instrs(nir_block *block, unsigned *count, switch (intr->intrinsic) { case nir_intrinsic_terminate: case nir_intrinsic_terminate_if: + case nir_intrinsic_demote: + case nir_intrinsic_demote_if: /* For non-CF hardware, we need to be able to move discards up * and flatten, so let them pass. */ - continue; + break; default: if (!nir_intrinsic_can_reorder(intr)) return false; @@ -412,7 +414,10 @@ rewrite_discard_conds(nir_instr *instr, nir_def *if_cond, bool is_else) return; nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); - if (intr->intrinsic != nir_intrinsic_terminate_if && intr->intrinsic != nir_intrinsic_terminate) + if (intr->intrinsic != nir_intrinsic_terminate_if && + intr->intrinsic != nir_intrinsic_terminate && + intr->intrinsic != nir_intrinsic_demote_if && + intr->intrinsic != nir_intrinsic_demote) return; nir_builder b = nir_builder_at(nir_before_instr(instr)); @@ -420,10 +425,14 @@ rewrite_discard_conds(nir_instr *instr, nir_def *if_cond, bool is_else) if (is_else) if_cond = nir_inot(&b, if_cond); - if (intr->intrinsic == nir_intrinsic_terminate_if) { + if (intr->intrinsic == nir_intrinsic_terminate_if || + intr->intrinsic == nir_intrinsic_demote_if) { nir_src_rewrite(&intr->src[0], nir_iand(&b, intr->src[0].ssa, if_cond)); } else { - nir_discard_if(&b, if_cond); + if (intr->intrinsic == nir_intrinsic_terminate) + nir_terminate_if(&b, if_cond); + else + nir_demote_if(&b, if_cond); nir_instr_remove(instr); } }