From c0143829f974ebc712cdd92f7a60205a4eefdd41 Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Tue, 6 Jan 2026 11:33:49 +0000 Subject: [PATCH] nir/opt_intrinsics: optimize inot(inverse_ballot(const)) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit No fossil-db changes. Signed-off-by: Rhys Perry Reviewed-by: Daniel Schürmann Part-of: --- src/compiler/nir/nir_opt_intrinsics.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/compiler/nir/nir_opt_intrinsics.c b/src/compiler/nir/nir_opt_intrinsics.c index 3bc0304ea03..59ca77fd4b4 100644 --- a/src/compiler/nir/nir_opt_intrinsics.c +++ b/src/compiler/nir/nir_opt_intrinsics.c @@ -230,6 +230,25 @@ try_opt_quad_vote(nir_builder *b, nir_alu_instr *alu, bool block_has_discard) return nir_quad_vote_any(b, 1, quad_broadcasts[0]->src[0].ssa); } +static bool +try_opt_inot_inverse_ballot(nir_builder *b, nir_alu_instr *alu) +{ + if (alu->def.bit_size != 1 || + !nir_src_is_intrinsic(alu->src[0].src) || + !list_is_singular(&alu->src[0].src.ssa->uses)) + return false; + + nir_intrinsic_instr *intrin = nir_src_as_intrinsic(alu->src[0].src); + if (intrin->intrinsic != nir_intrinsic_inverse_ballot || !nir_src_is_const(intrin->src[0])) + return false; + + alu->op = nir_op_mov; + b->cursor = nir_before_instr(&intrin->instr); + nir_src_rewrite(&intrin->src[0], nir_inot(b, intrin->src[0].ssa)); + + return true; +} + static bool opt_intrinsics_alu(nir_builder *b, nir_alu_instr *alu, bool block_has_discard) { @@ -246,6 +265,10 @@ opt_intrinsics_alu(nir_builder *b, nir_alu_instr *alu, bool block_has_discard) if (alu->def.bit_size == 1 && b->shader->options->optimize_quad_vote_to_reduce) replacement = try_opt_quad_vote(b, alu, block_has_discard); break; + case nir_op_inot: + if (try_opt_inot_inverse_ballot(b, alu)) + return true; + break; default: break; }