summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2015-02-06 12:06:04 -0800
committerJason Ekstrand <[email protected]>2015-02-19 17:06:16 -0800
commitb4c5489c8ac12eb2c9881ba2d8bb745203affb7b (patch)
tree4aa2bf29b4e43c97940d0e71f6d2081a123693c9
parent6316c90cc0daa9e9476b00e3c52c51190e782c3f (diff)
nir/dominance: Expose the dominance intersection function
Being able to find the least common anscestor in the dominance tree is a useful thing that we may want to do in other passes. In particular, we need it for GCM. v2: Handle NULL inputs by returning the other block Reviewed-by: Connor Abbott <[email protected]>
-rw-r--r--src/glsl/nir/nir.h2
-rw-r--r--src/glsl/nir/nir_dominance.c22
2 files changed, 24 insertions, 0 deletions
diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h
index f46ec151f6d..0784218c0db 100644
--- a/src/glsl/nir/nir.h
+++ b/src/glsl/nir/nir.h
@@ -1517,6 +1517,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 4927a292882..29589cbce23 100644
--- a/src/glsl/nir/nir_dominance.c
+++ b/src/glsl/nir/nir_dominance.c
@@ -212,6 +212,28 @@ nir_calc_dominance(nir_shader *shader)
}
}
+/**
+ * Computes the least common anscestor of two blocks. If one of the blocks
+ * is null, the other block is returned.
+ */
+nir_block *
+nir_dominance_lca(nir_block *b1, nir_block *b2)
+{
+ if (b1 == NULL)
+ return b2;
+
+ if (b2 == NULL)
+ return b1;
+
+ 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)
{