From 3cfdab8f928f469d2cd9e3363c05da5aaf0d2c9e Mon Sep 17 00:00:00 2001 From: Caio Oliveira Date: Fri, 9 Jun 2023 19:18:03 -0700 Subject: [PATCH] nir: Allow nir_gather_ssa_types() to ignore regs instead of assert If we infer a type for a reg, just ignore and keep going. This will allow to use this pass even when registers are present. Reviewed-by: Jesse Natalie Acked-by: Emma Anholt Part-of: --- src/compiler/nir/nir_gather_ssa_types.c | 82 +++++++++++++++---------- 1 file changed, 48 insertions(+), 34 deletions(-) diff --git a/src/compiler/nir/nir_gather_ssa_types.c b/src/compiler/nir/nir_gather_ssa_types.c index ed1ee8aac4b..dcef4a5342c 100644 --- a/src/compiler/nir/nir_gather_ssa_types.c +++ b/src/compiler/nir/nir_gather_ssa_types.c @@ -45,6 +45,10 @@ set_type(unsigned idx, nir_alu_type type, BITSET_WORD *float_types, } break; + case nir_type_invalid: + /* No new information, don't set anything. */ + break; + default: unreachable("Invalid base nir_alu_type"); } @@ -73,8 +77,10 @@ copy_types(nir_src src, nir_dest *dest, BITSET_WORD *float_types, BITSET_WORD *int_types, bool *progress) { bool src_is_sink = nir_src_is_const(src) || nir_src_is_undef(src); - copy_type(src.ssa->index, dest->ssa.index, src_is_sink, float_types, progress); - copy_type(src.ssa->index, dest->ssa.index, src_is_sink, int_types, progress); + if (src.is_ssa && dest->is_ssa) { + copy_type(src.ssa->index, dest->ssa.index, src_is_sink, float_types, progress); + copy_type(src.ssa->index, dest->ssa.index, src_is_sink, int_types, progress); + } } /** Gather up ALU types for SSA values @@ -104,7 +110,6 @@ nir_gather_ssa_types(nir_function_impl *impl, switch (instr->type) { case nir_instr_type_alu: { nir_alu_instr *alu = nir_instr_as_alu(instr); - assert(alu->dest.dest.is_ssa); const nir_op_info *info = &nir_op_infos[alu->op]; switch (alu->op) { case nir_op_mov: @@ -122,8 +127,10 @@ nir_gather_ssa_types(nir_function_impl *impl, case nir_op_bcsel: case nir_op_b32csel: - set_type(alu->src[0].src.ssa->index, nir_type_bool, - float_types, int_types, &progress); + if (alu->src[0].src.is_ssa) { + set_type(alu->src[0].src.ssa->index, nir_type_bool, + float_types, int_types, &progress); + } copy_types(alu->src[1].src, &alu->dest.dest, float_types, int_types, &progress); copy_types(alu->src[2].src, &alu->dest.dest, @@ -132,12 +139,15 @@ nir_gather_ssa_types(nir_function_impl *impl, default: for (unsigned i = 0; i < info->num_inputs; i++) { - assert(alu->src[i].src.is_ssa); - set_type(alu->src[i].src.ssa->index, info->input_types[i], + if (alu->src[i].src.is_ssa) { + set_type(alu->src[i].src.ssa->index, info->input_types[i], + float_types, int_types, &progress); + } + } + if (alu->dest.dest.is_ssa) { + set_type(alu->dest.dest.ssa.index, info->output_type, float_types, int_types, &progress); } - set_type(alu->dest.dest.ssa.index, info->output_type, - float_types, int_types, &progress); } break; } @@ -145,14 +155,16 @@ nir_gather_ssa_types(nir_function_impl *impl, case nir_instr_type_tex: { nir_tex_instr *tex = nir_instr_as_tex(instr); for (unsigned i = 0; i < tex->num_srcs; i++) { - assert(tex->src[i].src.is_ssa); - set_type(tex->src[i].src.ssa->index, - nir_tex_instr_src_type(tex, i), + if (tex->src[i].src.is_ssa) { + set_type(tex->src[i].src.ssa->index, + nir_tex_instr_src_type(tex, i), + float_types, int_types, &progress); + } + } + if (tex->dest.is_ssa) { + set_type(tex->dest.ssa.index, tex->dest_type, float_types, int_types, &progress); } - assert(tex->dest.is_ssa); - set_type(tex->dest.ssa.index, tex->dest_type, - float_types, int_types, &progress); break; } @@ -165,36 +177,40 @@ nir_gather_ssa_types(nir_function_impl *impl, case nir_intrinsic_load_deref: { nir_deref_instr *deref = nir_src_as_deref(intrin->src[0]); - assert(intrin->dest.is_ssa); - set_type(intrin->dest.ssa.index, - nir_get_nir_type_for_glsl_type(deref->type), - float_types, int_types, &progress); + if (intrin->dest.is_ssa) { + set_type(intrin->dest.ssa.index, + nir_get_nir_type_for_glsl_type(deref->type), + float_types, int_types, &progress); + } break; } case nir_intrinsic_store_deref: { nir_deref_instr *deref = nir_src_as_deref(intrin->src[0]); - assert(intrin->src[1].is_ssa); - set_type(intrin->src[1].ssa->index, - nir_get_nir_type_for_glsl_type(deref->type), - float_types, int_types, &progress); + if (intrin->src[1].is_ssa) { + set_type(intrin->src[1].ssa->index, + nir_get_nir_type_for_glsl_type(deref->type), + float_types, int_types, &progress); + } break; } case nir_intrinsic_load_input: case nir_intrinsic_load_uniform: - assert(intrin->dest.is_ssa); - set_type(intrin->dest.ssa.index, - nir_intrinsic_dest_type(intrin), - float_types, int_types, &progress); + if (intrin->dest.is_ssa) { + set_type(intrin->dest.ssa.index, + nir_intrinsic_dest_type(intrin), + float_types, int_types, &progress); + } break; case nir_intrinsic_store_output: - assert(intrin->src[0].is_ssa); - set_type(intrin->src[0].ssa->index, - nir_intrinsic_src_type(intrin), - float_types, int_types, &progress); + if (intrin->src[0].is_ssa) { + set_type(intrin->src[0].ssa->index, + nir_intrinsic_src_type(intrin), + float_types, int_types, &progress); + } break; default: @@ -207,8 +223,7 @@ nir_gather_ssa_types(nir_function_impl *impl, * IO intrinsic and flag it's offset and index sources. */ nir_src *offset_src = nir_get_io_offset_src(intrin); - if (offset_src) { - assert(offset_src->is_ssa); + if (offset_src && offset_src->is_ssa) { set_type(offset_src->ssa->index, nir_type_int, float_types, int_types, &progress); } @@ -217,7 +232,6 @@ nir_gather_ssa_types(nir_function_impl *impl, case nir_instr_type_phi: { nir_phi_instr *phi = nir_instr_as_phi(instr); - assert(phi->dest.is_ssa); nir_foreach_phi_src(src, phi) { copy_types(src->src, &phi->dest, float_types, int_types, &progress);