nir: Add a helper for figuring out what channels of an SSA def are read
authorJason Ekstrand <jason.ekstrand@intel.com>
Fri, 9 Oct 2015 15:13:43 +0000 (08:13 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Wed, 27 Apr 2016 02:55:04 +0000 (19:55 -0700)
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
src/compiler/nir/nir.c
src/compiler/nir/nir.h

index 5cafc41ec81e19caa4b94c9dd08abc72d49750a8..92bbc378ec1181647d6fcf2a744d336659ccd18f 100644 (file)
@@ -1476,6 +1476,31 @@ nir_ssa_def_rewrite_uses_after(nir_ssa_def *def, nir_src new_src,
       nir_if_rewrite_condition(use_src->parent_if, new_src);
 }
 
+uint8_t
+nir_ssa_def_components_read(nir_ssa_def *def)
+{
+   uint8_t read_mask = 0;
+   nir_foreach_use(def, use) {
+      if (use->parent_instr->type == nir_instr_type_alu) {
+         nir_alu_instr *alu = nir_instr_as_alu(use->parent_instr);
+         nir_alu_src *alu_src = exec_node_data(nir_alu_src, use, src);
+         int src_idx = alu_src - &alu->src[0];
+         assert(src_idx >= 0 && src_idx < nir_op_infos[alu->op].num_inputs);
+
+         for (unsigned c = 0; c < 4; c++) {
+            if (!nir_alu_instr_channel_used(alu, src_idx, c))
+               continue;
+
+            read_mask |= (1 << alu_src->swizzle[c]);
+         }
+      } else {
+         return (1 << def->num_components) - 1;
+      }
+   }
+
+   return read_mask;
+}
+
 static bool foreach_cf_node(nir_cf_node *node, nir_foreach_block_cb cb,
                             bool reverse, void *state);
 
index 4693ab58a598e05b53a16f6b2b3f1a4168ef7e40..a55e6821cbe506edd1995df4c24513cf2499417e 100644 (file)
@@ -2119,6 +2119,8 @@ void nir_ssa_def_rewrite_uses(nir_ssa_def *def, nir_src new_src);
 void nir_ssa_def_rewrite_uses_after(nir_ssa_def *def, nir_src new_src,
                                     nir_instr *after_me);
 
+uint8_t nir_ssa_def_components_read(nir_ssa_def *def);
+
 /* visits basic blocks in source-code order */
 typedef bool (*nir_foreach_block_cb)(nir_block *block, void *state);
 bool nir_foreach_block_call(nir_function_impl *impl, nir_foreach_block_cb cb,