Before the function involved three loops and three different branching conditions. Now it involves one loop and one if statement. This is a little simpler. --- src/glsl/nir/nir.h | 2 ++ src/glsl/nir/nir_dominance.c | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h index 4cb2e92..886dcd2 100644 --- a/src/glsl/nir/nir.h +++ b/src/glsl/nir/nir.h @@ -1500,6 +1500,8 @@ static inline void nir_validate_shader(nir_shader *shader) { } void nir_calc_dominance_impl(nir_function_impl *impl); void nir_calc_dominance(nir_shader *shader); +nir_block *nir_dominance_lca(nir_block *b1, nir_block *b2); + void nir_dump_dom_tree_impl(nir_function_impl *impl, FILE *fp); void nir_dump_dom_tree(nir_shader *shader, FILE *fp); diff --git a/src/glsl/nir/nir_dominance.c b/src/glsl/nir/nir_dominance.c index 67fdcc6..1022692 100644 --- a/src/glsl/nir/nir_dominance.c +++ b/src/glsl/nir/nir_dominance.c @@ -65,9 +65,9 @@ intersect(nir_block *b1, nir_block *b2) * because we index blocks from beginning -> end (i.e. reverse * post-order) instead of post-order like they assume. */ - while (b1->index > b2->index) + if (b1->index > b2->index) b1 = b1->imm_dom; - while (b2->index > b1->index) + else b2 = b2->imm_dom; } @@ -212,6 +212,18 @@ nir_calc_dominance(nir_shader *shader) } } +nir_block * +nir_dominance_lca(nir_block *b1, nir_block *b2) +{ + assert(nir_cf_node_get_function(&b1->cf_node) == + nir_cf_node_get_function(&b2->cf_node)); + + assert(nir_cf_node_get_function(&b1->cf_node)->valid_metadata & + nir_metadata_dominance); + + return intersect(b1, b2); +} + static bool dump_block_dom(nir_block *block, void *state) { -- 2.2.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev