[Mesa-dev] [PATCH 127/133] nir: Use nir_foreach_ssa_def for setting up ssa destinations

Jason Ekstrand jason at jlekstrand.net
Mon Dec 15 22:13:10 PST 2014


Before, we were using foreach_dest and switching on whether the destination
was an SSA value.  This works, except not all destinations are SSA values
so we have to special-case ssa_undef instructions.  Now that we have a
foreach_ssa_def function, we can iterate over all of the register
destinations in one pass and iterate over the SSA destinations in a second.
This way, if we add other ssa-only instructions, we won't have to worry
about adding them to the special case we have for ssa_undef.
---
 src/glsl/nir/nir.c | 24 +++++++++++-------------
 1 file changed, 11 insertions(+), 13 deletions(-)

diff --git a/src/glsl/nir/nir.c b/src/glsl/nir/nir.c
index 72a8840..e128b48 100644
--- a/src/glsl/nir/nir.c
+++ b/src/glsl/nir/nir.c
@@ -1173,27 +1173,28 @@ add_use_cb(nir_src *src, void *state)
    return true;
 }
 
-static void
-add_ssa_def(nir_instr *instr, nir_ssa_def *def)
+static bool
+add_ssa_def_cb(nir_ssa_def *def, void *state)
 {
+   nir_instr *instr = (nir_instr *) state;
+
    if (instr->block && def->index == UINT_MAX) {
       nir_function_impl *impl =
          nir_cf_node_get_function(&instr->block->cf_node);
 
       def->index = impl->ssa_alloc++;
    }
+
+   return true;
 }
 
 static bool
-add_def_cb(nir_dest *dest, void *state)
+add_reg_def_cb(nir_dest *dest, void *state)
 {
    nir_instr *instr = (nir_instr *) state;
 
-   if (dest->is_ssa) {
-      add_ssa_def(instr, &dest->ssa);
-   } else {
+   if (!dest->is_ssa)
       _mesa_set_add(dest->reg.reg->defs, _mesa_hash_pointer(instr), instr);
-   }
 
    return true;
 }
@@ -1201,12 +1202,9 @@ add_def_cb(nir_dest *dest, void *state)
 static void
 add_defs_uses(nir_instr *instr)
 {
-   if (instr->type == nir_instr_type_ssa_undef) {
-      add_ssa_def(instr, &nir_instr_as_ssa_undef(instr)->def);
-   } else {
-      nir_foreach_src(instr, add_use_cb, instr);
-      nir_foreach_dest(instr, add_def_cb, instr);
-   }
+   nir_foreach_src(instr, add_use_cb, instr);
+   nir_foreach_dest(instr, add_reg_def_cb, instr);
+   nir_foreach_ssa_def(instr, add_ssa_def_cb, instr);
 }
 
 void
-- 
2.2.0



More information about the mesa-dev mailing list