Mesa (master): nir/dominance: Expose the dominance intersection function

Jason Ekstrand jekstrand at kemper.freedesktop.org
Fri Feb 20 01:09:27 UTC 2015


Module: Mesa
Branch: master
Commit: b4c5489c8ac12eb2c9881ba2d8bb745203affb7b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=b4c5489c8ac12eb2c9881ba2d8bb745203affb7b

Author: Jason Ekstrand <jason.ekstrand at intel.com>
Date:   Fri Feb  6 12:06:04 2015 -0800

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 <cwabbott0 at gmail.com>

---

 src/glsl/nir/nir.h           |    2 ++
 src/glsl/nir/nir_dominance.c |   22 ++++++++++++++++++++++
 2 files changed, 24 insertions(+)

diff --git a/src/glsl/nir/nir.h b/src/glsl/nir/nir.h
index f46ec15..0784218 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 4927a29..29589cb 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)
 {




More information about the mesa-commit mailing list