nir: add nir_scalar intrinsic helpers

Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24656>
This commit is contained in:
Georg Lehmann 2023-08-13 00:03:03 +02:00 committed by Marge Bot
parent 1ae3c40732
commit bce9bba90d
6 changed files with 32 additions and 21 deletions

View file

@ -257,7 +257,7 @@ can_move_coord(nir_scalar scalar, coord_info *info)
if (nir_scalar_is_const(scalar))
return true;
if (scalar.def->parent_instr->type != nir_instr_type_intrinsic)
if (!nir_scalar_is_intrinsic(scalar))
return false;
nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(scalar.def->parent_instr);
@ -272,8 +272,8 @@ can_move_coord(nir_scalar scalar, coord_info *info)
nir_scalar coord_x = nir_scalar_resolved(intrin->src[0].ssa, 0);
nir_scalar coord_y = nir_scalar_resolved(intrin->src[0].ssa, 1);
if (coord_x.def->parent_instr->type != nir_instr_type_intrinsic || coord_x.comp != 0 ||
coord_y.def->parent_instr->type != nir_instr_type_intrinsic || coord_y.comp != 1)
if (!nir_scalar_is_intrinsic(coord_x) || coord_x.comp != 0 ||
!nir_scalar_is_intrinsic(coord_y) || coord_y.comp != 1)
return false;
nir_intrinsic_instr *intrin_x = nir_instr_as_intrinsic(coord_x.def->parent_instr);

View file

@ -2623,6 +2623,18 @@ nir_scalar_alu_op(nir_scalar s)
return nir_instr_as_alu(s.def->parent_instr)->op;
}
static inline bool
nir_scalar_is_intrinsic(nir_scalar s)
{
return s.def->parent_instr->type == nir_instr_type_intrinsic;
}
static inline nir_intrinsic_op
nir_scalar_intrinsic_op(nir_scalar s)
{
return nir_instr_as_intrinsic(s.def->parent_instr)->intrinsic;
}
static inline nir_scalar
nir_scalar_chase_alu_src(nir_scalar s, unsigned alu_src_idx)
{

View file

@ -31,18 +31,16 @@ static bool
src_is_invocation_id(const nir_src *src)
{
nir_scalar s = nir_scalar_resolved(src->ssa, 0);
return s.def->parent_instr->type == nir_instr_type_intrinsic &&
nir_instr_as_intrinsic(s.def->parent_instr)->intrinsic ==
nir_intrinsic_load_invocation_id;
return nir_scalar_is_intrinsic(s) &&
nir_scalar_intrinsic_op(s) == nir_intrinsic_load_invocation_id;
}
static bool
src_is_local_invocation_index(const nir_src *src)
{
nir_scalar s = nir_scalar_resolved(src->ssa, 0);
return s.def->parent_instr->type == nir_instr_type_intrinsic &&
nir_instr_as_intrinsic(s.def->parent_instr)->intrinsic ==
nir_intrinsic_load_local_invocation_index;
return nir_scalar_is_intrinsic(s) &&
nir_scalar_intrinsic_op(s) == nir_intrinsic_load_local_invocation_index;
}
static void

View file

@ -1408,10 +1408,10 @@ opt_if_rewrite_uniform_uses(nir_builder *b, nir_if *nif, nir_scalar cond, bool a
nir_scalar src_uni = nir_scalar_chase_alu_src(cond, i);
nir_scalar src_div = nir_scalar_chase_alu_src(cond, !i);
if (src_uni.def->parent_instr->type == nir_instr_type_load_const && src_div.def != src_uni.def)
if (nir_scalar_is_const(src_uni) && src_div.def != src_uni.def)
return rewrite_comp_uses_within_if(b, nif, op == nir_op_ine, src_div, src_uni);
if (src_uni.def->parent_instr->type != nir_instr_type_intrinsic)
if (!nir_scalar_is_intrinsic(src_uni))
continue;
nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(src_uni.def->parent_instr);
if (intrin->intrinsic != nir_intrinsic_read_first_invocation &&

View file

@ -119,18 +119,19 @@ get_dim(nir_scalar scalar)
if (!scalar.def->divergent)
return 0;
if (scalar.def->parent_instr->type == nir_instr_type_intrinsic) {
nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(scalar.def->parent_instr);
if (intrin->intrinsic == nir_intrinsic_load_subgroup_invocation)
if (nir_scalar_is_intrinsic(scalar)) {
switch (nir_scalar_intrinsic_op(scalar)) {
case nir_intrinsic_load_subgroup_invocation:
return 0x8;
else if (intrin->intrinsic == nir_intrinsic_load_local_invocation_index)
case nir_intrinsic_load_global_invocation_index:
case nir_intrinsic_load_local_invocation_index:
return 0x7;
else if (intrin->intrinsic == nir_intrinsic_load_local_invocation_id)
return 1 << scalar.comp;
else if (intrin->intrinsic == nir_intrinsic_load_global_invocation_index)
return 0x7;
else if (intrin->intrinsic == nir_intrinsic_load_global_invocation_id)
case nir_intrinsic_load_global_invocation_id:
case nir_intrinsic_load_local_invocation_id:
return 1 << scalar.comp;
default:
break;
}
} else if (nir_scalar_is_alu(scalar)) {
if (nir_scalar_alu_op(scalar) == nir_op_iadd ||
nir_scalar_alu_op(scalar) == nir_op_imul) {

View file

@ -1927,7 +1927,7 @@ process_uub_query(struct analysis_state *state, struct analysis_query *aq, uint3
*result = bitmask(q.scalar.def->bit_size);
if (nir_scalar_is_const(q.scalar))
*result = nir_scalar_as_uint(q.scalar);
else if (q.scalar.def->parent_instr->type == nir_instr_type_intrinsic)
else if (nir_scalar_is_intrinsic(q.scalar))
get_intrinsic_uub(state, q, result, src);
else if (nir_scalar_is_alu(q.scalar))
get_alu_uub(state, q, result, src);