SpirvShader: Optimize SIMD::Pointer load of static equal offsets
Bug: b/135609394
Change-Id: Ica8267cf4e2c09952282f0902c781c2544e4564c
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/33188
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Tested-by: Ben Clayton <bclayton@google.com>
diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp
index 83f12c2..f23f859 100644
--- a/src/Pipeline/SpirvShader.cpp
+++ b/src/Pipeline/SpirvShader.cpp
@@ -294,6 +294,19 @@
mask &= ptr.isInBounds(sizeof(float)); // Disable OOB reads.
if (!atomic && order == std::memory_order_relaxed)
{
+ if (ptr.hasStaticEqualOffsets())
+ {
+ // Load one, replicate.
+ // Be careful of the case where the post-bounds-check mask
+ // is 0, in which case we must not load.
+ T out = T(0);
+ If(AnyTrue(mask))
+ {
+ EL el = *rr::Pointer<EL>(ptr.base + ptr.staticOffsets[0], sizeof(float));
+ out = T(el);
+ }
+ return out;
+ }
if (ptr.hasStaticSequentialOffsets(sizeof(float)))
{
return rr::MaskedLoad(rr::Pointer<T>(ptr.base + ptr.staticOffsets[0]), mask, sizeof(float));