[Mesa-dev] [PATCH 1/2] nir: Add is_divergent_vector search helper
Alyssa Rosenzweig
alyssa at rosenzweig.io
Tue May 7 03:00:03 UTC 2019
This allows algebraic optimizations to check if the argument accesses
multiple distinct components of a vector. So a swizzle like "xyz" will
return true, but "yyy" will return false, as will a scalar. This can be
useful for optimizations on vector processors, where a convergent
swizzle can be done in one clock (replicating as if a scalar) but a
divergent one must be scalarized. In these cases, it is useful to
optimize differently based on whether the swizzle diverges. (Use case is
the "csel" condition on Midgard).
Signed-off-by: Alyssa Rosenzweig <alyssa at rosenzweig.io>
Cc: Jason Ekstrand <jason at jlekstrand.net>
---
src/compiler/nir/nir_search_helpers.h | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/src/compiler/nir/nir_search_helpers.h b/src/compiler/nir/nir_search_helpers.h
index 1624508993d..46d7c300643 100644
--- a/src/compiler/nir/nir_search_helpers.h
+++ b/src/compiler/nir/nir_search_helpers.h
@@ -143,6 +143,22 @@ is_not_const(nir_alu_instr *instr, unsigned src, UNUSED unsigned num_components,
return !nir_src_is_const(instr->src[src].src);
}
+/* I.e. a vector that actually accesses multiple channels */
+
+static inline bool
+is_divergent_vector(nir_alu_instr *instr, UNUSED unsigned src, unsigned num_components,
+ const uint8_t *swizzle)
+{
+ unsigned first_component = swizzle[0];
+
+ for (unsigned i = 1; i < num_components; ++i) {
+ if (swizzle[i] != first_component)
+ return true;
+ }
+
+ return false;
+}
+
static inline bool
is_used_more_than_once(nir_alu_instr *instr)
{
--
2.20.1
More information about the mesa-dev
mailing list