[PATCH] D74064: [Analysis] add query to get splat value from array of ints
Sanjay Patel via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 5 12:01:53 PST 2020
This revision was automatically updated to reflect the committed changes.
Closed by commit rG686a038ed8f9: [Analysis] add query to get splat value from array of ints (authored by spatel).
Changed prior to commit:
https://reviews.llvm.org/D74064?vs=242642&id=242720#toc
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D74064/new/
https://reviews.llvm.org/D74064
Files:
llvm/include/llvm/Analysis/VectorUtils.h
llvm/lib/Analysis/VectorUtils.cpp
llvm/unittests/Analysis/VectorUtilsTest.cpp
Index: llvm/unittests/Analysis/VectorUtilsTest.cpp
===================================================================
--- llvm/unittests/Analysis/VectorUtilsTest.cpp
+++ llvm/unittests/Analysis/VectorUtilsTest.cpp
@@ -98,6 +98,17 @@
EXPECT_FALSE(isSplatValue(SplatWithUndefC));
}
+TEST_F(BasicTest, getSplatIndex) {
+ EXPECT_EQ(getSplatIndex({0,0,0}), 0);
+ EXPECT_EQ(getSplatIndex({1,0,0}), -1); // no splat
+ EXPECT_EQ(getSplatIndex({0,1,1}), -1); // no splat
+ EXPECT_EQ(getSplatIndex({42,42,42}), 42); // array size is independent of splat index
+ EXPECT_EQ(getSplatIndex({42,42,-1}), 42); // ignore negative
+ EXPECT_EQ(getSplatIndex({-1,42,-1}), 42); // ignore negatives
+ EXPECT_EQ(getSplatIndex({-4,42,-42}), 42); // ignore all negatives
+ EXPECT_EQ(getSplatIndex({-4,-1,-42}), -1); // all negative values map to -1
+}
+
TEST_F(VectorUtilsTest, isSplatValue_00) {
parseAssembly(
"define <2 x i8> @test(<2 x i8> %x) {\n"
Index: llvm/lib/Analysis/VectorUtils.cpp
===================================================================
--- llvm/lib/Analysis/VectorUtils.cpp
+++ llvm/lib/Analysis/VectorUtils.cpp
@@ -307,6 +307,24 @@
return nullptr;
}
+int llvm::getSplatIndex(ArrayRef<int> Mask) {
+ int SplatIndex = -1;
+ for (int M : Mask) {
+ // Ignore invalid (undefined) mask elements.
+ if (M < 0)
+ continue;
+
+ // There can be only 1 non-negative mask element value if this is a splat.
+ if (SplatIndex != -1 && SplatIndex != M)
+ return -1;
+
+ // Initialize the splat index to the 1st non-negative mask element.
+ SplatIndex = M;
+ }
+ assert((SplatIndex == -1 || SplatIndex >= 0) && "Negative index?");
+ return SplatIndex;
+}
+
/// Get splat value if the input is a splat vector or return nullptr.
/// This function is not fully general. It checks only 2 cases:
/// the input value is (1) a splat constant vector or (2) a sequence
Index: llvm/include/llvm/Analysis/VectorUtils.h
===================================================================
--- llvm/include/llvm/Analysis/VectorUtils.h
+++ llvm/include/llvm/Analysis/VectorUtils.h
@@ -301,6 +301,11 @@
/// from the vector.
Value *findScalarElement(Value *V, unsigned EltNo);
+/// If all non-negative \p Mask elements are the same value, return that value.
+/// If all elements are negative (undefined) or \p Mask contains different
+/// non-negative values, return -1.
+int getSplatIndex(ArrayRef<int> Mask);
+
/// Get splat value if the input is a splat vector or return nullptr.
/// The value may be extracted from a splat constants vector or from
/// a sequence of instructions that broadcast a single value into a vector.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D74064.242720.patch
Type: text/x-patch
Size: 2682 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200205/592d8941/attachment.bin>
More information about the llvm-commits
mailing list