diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 157051207b2..7209d28e853 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -1171,7 +1171,15 @@ nir_src_num_components(nir_src src) return src.ssa->num_components; } -bool nir_src_is_divergent(nir_src *src); +nir_block *nir_src_get_block(nir_src *src); + +bool nir_def_is_divergent_at_use_block(nir_def *def, nir_block *block); + +static inline bool +nir_src_is_divergent(nir_src *src) +{ + return nir_def_is_divergent_at_use_block(src->ssa, nir_src_get_block(src)); +} /* Are all components the same, ie. .xxxx */ static inline bool @@ -4536,7 +4544,6 @@ const char *nir_src_as_string(nir_src src); bool nir_src_is_always_uniform(nir_src src); bool nir_srcs_equal(nir_src src1, nir_src src2); bool nir_instrs_equal(const nir_instr *instr1, const nir_instr *instr2); -nir_block *nir_src_get_block(nir_src *src); static inline void nir_src_rewrite(nir_src *src, nir_def *new_ssa) diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c index b64f673b18c..f778edddce3 100644 --- a/src/compiler/nir/nir_divergence_analysis.c +++ b/src/compiler/nir/nir_divergence_analysis.c @@ -68,13 +68,13 @@ static bool visit_cf_list(struct exec_list *list, struct divergence_state *state); bool -nir_src_is_divergent(nir_src *src) +nir_def_is_divergent_at_use_block(nir_def *def, nir_block *block) { - if (src->ssa->divergent) + if (def->divergent) return true; - nir_cf_node *use_node = nir_src_get_block(src)->cf_node.parent; - nir_cf_node *def_node = nir_def_block(src->ssa)->cf_node.parent; + nir_cf_node *use_node = block->cf_node.parent; + nir_cf_node *def_node = nir_def_block(def)->cf_node.parent; /* Short-cut the common case. */ if (def_node == use_node) @@ -83,7 +83,7 @@ nir_src_is_divergent(nir_src *src) /* If the source was computed in a divergent loop, and is not * loop-invariant, then it must also be considered divergent. */ - bool loop_invariant = src->ssa->loop_invariant; + bool loop_invariant = def->loop_invariant; while (def_node) { if (def_node->type == nir_cf_node_loop) { /* Check whether the use is inside this loop. */