Module: Mesa Branch: main Commit: 9f341cefbbda843263dbc62dc6ffcf40948efb14 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=9f341cefbbda843263dbc62dc6ffcf40948efb14
Author: Alyssa Rosenzweig <aly...@rosenzweig.io> Date: Mon Nov 6 17:19:05 2023 -0400 nir/validate: Don't check dimensions in validate_def Instead, check it at the call sites when actually required (basically just intrinsics), reducing the branching required when not (ALU validation, the hottest of hot paths for CI). IMHO this is more obvious too. Signed-off-by: Alyssa Rosenzweig <aly...@rosenzweig.io> Reviewed-by: Faith Ekstrand <faith.ekstr...@collabora.com> Reviewed-by: Rhys Perry <pendingchao...@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26084> --- src/compiler/nir/nir_validate.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/compiler/nir/nir_validate.c b/src/compiler/nir/nir_validate.c index b113b2f5234..2cbdfff6ea1 100644 --- a/src/compiler/nir/nir_validate.c +++ b/src/compiler/nir/nir_validate.c @@ -219,14 +219,8 @@ validate_alu_src(nir_alu_instr *instr, unsigned index, validate_state *state) } static void -validate_def(nir_def *def, validate_state *state, - unsigned bit_sizes, unsigned num_components) +validate_def(nir_def *def, validate_state *state) { - if (bit_sizes) - validate_assert(state, def->bit_size & bit_sizes); - if (num_components) - validate_assert(state, def->num_components == num_components); - validate_assert(state, def->index < state->impl->ssa_alloc); validate_assert(state, !BITSET_TEST(state->ssa_defs_found, def->index)); BITSET_SET(state->ssa_defs_found, def->index); @@ -301,7 +295,7 @@ validate_alu_instr(nir_alu_instr *instr, validate_state *state) dest_bit_size == 64); } - validate_def(&instr->def, state, 0, 0); + validate_def(&instr->def, state); } static void @@ -421,7 +415,7 @@ validate_deref_instr(nir_deref_instr *instr, validate_state *state) * want to let other compiler components such as SPIR-V decide how big * pointers should be. */ - validate_def(&instr->def, state, 0, 0); + validate_def(&instr->def, state); /* Certain modes cannot be used as sources for phi instructions because * way too many passes assume that they can always chase deref chains. @@ -729,7 +723,11 @@ validate_intrinsic_instr(nir_intrinsic_instr *instr, validate_state *state) else dest_bit_size = dest_bit_size ? dest_bit_size : bit_sizes; - validate_def(&instr->def, state, dest_bit_size, components_written); + validate_def(&instr->def, state); + validate_assert(state, instr->def.num_components == components_written); + + if (dest_bit_size) + validate_assert(state, instr->def.bit_size & dest_bit_size); } if (!vectorized_intrinsic(instr)) @@ -885,7 +883,9 @@ validate_tex_instr(nir_tex_instr *instr, validate_state *state) if (instr->is_gather_implicit_lod) validate_assert(state, instr->op == nir_texop_tg4); - validate_def(&instr->def, state, 0, nir_tex_instr_dest_size(instr)); + validate_def(&instr->def, state); + validate_assert(state, instr->def.num_components == + nir_tex_instr_dest_size(instr)); unsigned bit_size = nir_alu_type_get_type_size(instr->dest_type); validate_assert(state, @@ -942,7 +942,7 @@ validate_const_value(nir_const_value *val, unsigned bit_size, static void validate_load_const_instr(nir_load_const_instr *instr, validate_state *state) { - validate_def(&instr->def, state, 0, 0); + validate_def(&instr->def, state); for (unsigned i = 0; i < instr->def.num_components; i++) validate_const_value(&instr->value[i], instr->def.bit_size, false, state); @@ -951,7 +951,7 @@ validate_load_const_instr(nir_load_const_instr *instr, validate_state *state) static void validate_ssa_undef_instr(nir_undef_instr *instr, validate_state *state) { - validate_def(&instr->def, state, 0, 0); + validate_def(&instr->def, state); } static void @@ -962,7 +962,7 @@ validate_phi_instr(nir_phi_instr *instr, validate_state *state) * basic blocks, to avoid validating an SSA use before its definition. */ - validate_def(&instr->def, state, 0, 0); + validate_def(&instr->def, state); exec_list_validate(&instr->srcs); validate_assert(state, exec_list_length(&instr->srcs) ==