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 <jenatali@microsoft.com>
Acked-by: Emma Anholt <emma@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23562>
This commit is contained in:
Caio Oliveira
2023-06-09 19:18:03 -07:00
committed by Marge Bot
parent 1e2f647fbb
commit 3cfdab8f92
+48 -34
View File
@@ -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);