diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c index 9abc06f46ff..c441af3e5d1 100644 --- a/src/compiler/nir/nir.c +++ b/src/compiler/nir/nir.c @@ -1729,32 +1729,42 @@ get_store_value(nir_intrinsic_instr *intrin) return intrin->src[0].ssa; } +nir_component_mask_t +nir_src_components_read(const nir_src *src) +{ + assert(src->is_ssa && src->parent_instr); + + if (src->parent_instr->type == nir_instr_type_alu) { + nir_alu_instr *alu = nir_instr_as_alu(src->parent_instr); + nir_alu_src *alu_src = exec_node_data(nir_alu_src, src, src); + int src_idx = alu_src - &alu->src[0]; + assert(src_idx >= 0 && src_idx < nir_op_infos[alu->op].num_inputs); + return nir_alu_instr_src_read_mask(alu, src_idx); + } else if (src->parent_instr->type == nir_instr_type_intrinsic) { + nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(src->parent_instr); + if (nir_intrinsic_has_write_mask(intrin) && src->ssa == get_store_value(intrin)) + return nir_intrinsic_write_mask(intrin); + else + return (1 << src->ssa->num_components) - 1; + } else { + return (1 << src->ssa->num_components) - 1; + } +} + nir_component_mask_t nir_ssa_def_components_read(const nir_ssa_def *def) { nir_component_mask_t read_mask = 0; - nir_foreach_use(use, def) { - if (use->parent_instr->type == nir_instr_type_alu) { - nir_alu_instr *alu = nir_instr_as_alu(use->parent_instr); - nir_alu_src *alu_src = exec_node_data(nir_alu_src, use, src); - int src_idx = alu_src - &alu->src[0]; - assert(src_idx >= 0 && src_idx < nir_op_infos[alu->op].num_inputs); - read_mask |= nir_alu_instr_src_read_mask(alu, src_idx); - } else if (use->parent_instr->type == nir_instr_type_intrinsic) { - nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(use->parent_instr); - if (nir_intrinsic_has_write_mask(intrin) && use->ssa == get_store_value(intrin)) { - read_mask |= nir_intrinsic_write_mask(intrin); - } else { - return (1 << def->num_components) - 1; - } - } else { - return (1 << def->num_components) - 1; - } - } if (!list_is_empty(&def->if_uses)) read_mask |= 1; + nir_foreach_use(use, def) { + read_mask |= nir_src_components_read(use); + if (read_mask == (1 << def->num_components) - 1) + return read_mask; + } + return read_mask; } diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 7ef549c7435..36e0feda00f 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -4327,6 +4327,7 @@ void nir_ssa_def_rewrite_uses_src(nir_ssa_def *def, nir_src new_src); void nir_ssa_def_rewrite_uses_after(nir_ssa_def *def, nir_ssa_def *new_ssa, nir_instr *after_me); +nir_component_mask_t nir_src_components_read(const nir_src *src); nir_component_mask_t nir_ssa_def_components_read(const nir_ssa_def *def); static inline bool