summaryrefslogtreecommitdiffstats
path: root/src/compiler/nir/nir.c
diff options
context:
space:
mode:
authorJason Ekstrand <[email protected]>2015-10-09 08:13:43 -0700
committerKenneth Graunke <[email protected]>2016-04-26 19:55:04 -0700
commitd800b7daa5440f6b49b5e0ae6e404d240c6a4ddc (patch)
treea92cbc618f16c62fff1bf65c75c41f1b6e126af7 /src/compiler/nir/nir.c
parentacc2f1fe361af87ce4d50b7e2b58e0da093477e1 (diff)
nir: Add a helper for figuring out what channels of an SSA def are read
Reviewed-by: Kenneth Graunke <[email protected]> Reviewed-by: Topi Pohjolainen <[email protected]>
Diffstat (limited to 'src/compiler/nir/nir.c')
-rw-r--r--src/compiler/nir/nir.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c
index 5cafc41ec81..92bbc378ec1 100644
--- a/src/compiler/nir/nir.c
+++ b/src/compiler/nir/nir.c
@@ -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);