summaryrefslogtreecommitdiffstats
path: root/llvm/unittests
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/unittests')
-rw-r--r--llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp126
-rw-r--r--llvm/unittests/CodeGen/LowLevelTypeTest.cpp55
2 files changed, 181 insertions, 0 deletions
diff --git a/llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp b/llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp
index 4578b95c203..3617388c04e 100644
--- a/llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp
+++ b/llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp
@@ -206,11 +206,21 @@ TEST(LegalizerInfoTest, SizeChangeStrategy) {
TEST(LegalizerInfoTest, RuleSets) {
using namespace TargetOpcode;
+ const LLT s5 = LLT::scalar(5);
+ const LLT s8 = LLT::scalar(8);
+ const LLT s16 = LLT::scalar(16);
const LLT s32 = LLT::scalar(32);
+ const LLT s33 = LLT::scalar(33);
+ const LLT s64 = LLT::scalar(64);
+ const LLT v2s5 = LLT::vector(2, 5);
+ const LLT v2s8 = LLT::vector(2, 8);
+ const LLT v2s16 = LLT::vector(2, 16);
const LLT v2s32 = LLT::vector(2, 32);
const LLT v3s32 = LLT::vector(3, 32);
const LLT v4s32 = LLT::vector(4, 32);
+ const LLT v2s33 = LLT::vector(2, 33);
+ const LLT v2s64 = LLT::vector(2, 64);
const LLT p0 = LLT::pointer(0, 32);
const LLT v3p0 = LLT::vector(3, p0);
@@ -229,4 +239,120 @@ TEST(LegalizerInfoTest, RuleSets) {
EXPECT_ACTION(MoreElements, 0, v4p0, LegalityQuery(G_IMPLICIT_DEF, {v3p0}));
EXPECT_ACTION(MoreElements, 0, v4s32, LegalityQuery(G_IMPLICIT_DEF, {v3s32}));
}
+
+ // Test minScalarOrElt
+ {
+ LegalizerInfo LI;
+ LI.getActionDefinitionsBuilder(G_OR)
+ .legalFor({s32})
+ .minScalarOrElt(0, s32);
+ LI.computeTables();
+
+ EXPECT_ACTION(WidenScalar, 0, s32, LegalityQuery(G_OR, {s16}));
+ EXPECT_ACTION(WidenScalar, 0, v2s32, LegalityQuery(G_OR, {v2s16}));
+ }
+
+ // Test maxScalarOrELt
+ {
+ LegalizerInfo LI;
+ LI.getActionDefinitionsBuilder(G_AND)
+ .legalFor({s16})
+ .maxScalarOrElt(0, s16);
+ LI.computeTables();
+
+ EXPECT_ACTION(NarrowScalar, 0, s16, LegalityQuery(G_AND, {s32}));
+ EXPECT_ACTION(NarrowScalar, 0, v2s16, LegalityQuery(G_AND, {v2s32}));
+ }
+
+ // Test clampScalarOrElt
+ {
+ LegalizerInfo LI;
+ LI.getActionDefinitionsBuilder(G_XOR)
+ .legalFor({s16})
+ .clampScalarOrElt(0, s16, s32);
+ LI.computeTables();
+
+ EXPECT_ACTION(NarrowScalar, 0, s32, LegalityQuery(G_XOR, {s64}));
+ EXPECT_ACTION(WidenScalar, 0, s16, LegalityQuery(G_XOR, {s8}));
+
+ // Make sure the number of elements is preserved.
+ EXPECT_ACTION(NarrowScalar, 0, v2s32, LegalityQuery(G_XOR, {v2s64}));
+ EXPECT_ACTION(WidenScalar, 0, v2s16, LegalityQuery(G_XOR, {v2s8}));
+ }
+
+ // Test minScalar
+ {
+ LegalizerInfo LI;
+ LI.getActionDefinitionsBuilder(G_OR)
+ .legalFor({s32})
+ .minScalar(0, s32);
+ LI.computeTables();
+
+ // Only handle scalars, ignore vectors.
+ EXPECT_ACTION(WidenScalar, 0, s32, LegalityQuery(G_OR, {s16}));
+ EXPECT_ACTION(Unsupported, 0, LLT(), LegalityQuery(G_OR, {v2s16}));
+ }
+
+ // Test maxScalar
+ {
+ LegalizerInfo LI;
+ LI.getActionDefinitionsBuilder(G_AND)
+ .legalFor({s16})
+ .maxScalar(0, s16);
+ LI.computeTables();
+
+ // Only handle scalars, ignore vectors.
+ EXPECT_ACTION(NarrowScalar, 0, s16, LegalityQuery(G_AND, {s32}));
+ EXPECT_ACTION(Unsupported, 0, LLT(), LegalityQuery(G_AND, {v2s32}));
+ }
+
+ // Test clampScalar
+ {
+ LegalizerInfo LI;
+
+ LI.getActionDefinitionsBuilder(G_XOR)
+ .legalFor({s16})
+ .clampScalar(0, s16, s32);
+ LI.computeTables();
+
+ EXPECT_ACTION(NarrowScalar, 0, s32, LegalityQuery(G_XOR, {s64}));
+ EXPECT_ACTION(WidenScalar, 0, s16, LegalityQuery(G_XOR, {s8}));
+
+ // Only handle scalars, ignore vectors.
+ EXPECT_ACTION(Unsupported, 0, LLT(), LegalityQuery(G_XOR, {v2s64}));
+ EXPECT_ACTION(Unsupported, 0, LLT(), LegalityQuery(G_XOR, {v2s8}));
+ }
+
+ // Test widenScalarOrEltToNextPow2
+ {
+ LegalizerInfo LI;
+
+ LI.getActionDefinitionsBuilder(G_AND)
+ .legalFor({s32})
+ .widenScalarOrEltToNextPow2(0, 32);
+ LI.computeTables();
+
+ // Handle scalars and vectors
+ EXPECT_ACTION(WidenScalar, 0, s32, LegalityQuery(G_AND, {s5}));
+ EXPECT_ACTION(WidenScalar, 0, v2s32, LegalityQuery(G_AND, {v2s5}));
+ EXPECT_ACTION(WidenScalar, 0, s64, LegalityQuery(G_AND, {s33}));
+ EXPECT_ACTION(WidenScalar, 0, v2s64, LegalityQuery(G_AND, {v2s33}));
+ }
+
+ // Test widenScalarToNextPow2
+ {
+ LegalizerInfo LI;
+
+ LI.getActionDefinitionsBuilder(G_AND)
+ .legalFor({s32})
+ .widenScalarToNextPow2(0, 32);
+ LI.computeTables();
+
+ EXPECT_ACTION(WidenScalar, 0, s32, LegalityQuery(G_AND, {s5}));
+ EXPECT_ACTION(WidenScalar, 0, s64, LegalityQuery(G_AND, {s33}));
+
+ // Do nothing for vectors.
+ EXPECT_ACTION(Unsupported, 0, LLT(), LegalityQuery(G_AND, {v2s5}));
+ EXPECT_ACTION(Unsupported, 0, LLT(), LegalityQuery(G_AND, {v2s33}));
+ }
}
diff --git a/llvm/unittests/CodeGen/LowLevelTypeTest.cpp b/llvm/unittests/CodeGen/LowLevelTypeTest.cpp
index 52df852b403..bf4277d82fd 100644
--- a/llvm/unittests/CodeGen/LowLevelTypeTest.cpp
+++ b/llvm/unittests/CodeGen/LowLevelTypeTest.cpp
@@ -106,6 +106,61 @@ TEST(LowLevelTypeTest, ScalarOrVector) {
LLT::scalarOrVector(2, LLT::pointer(1, 32)));
}
+TEST(LowLevelTypeTest, ChangeElementType) {
+ const LLT P0 = LLT::pointer(0, 32);
+ const LLT P1 = LLT::pointer(1, 64);
+
+ const LLT S32 = LLT::scalar(32);
+ const LLT S64 = LLT::scalar(64);
+
+ const LLT V2S32 = LLT::vector(2, 32);
+ const LLT V2S64 = LLT::vector(2, 64);
+
+ const LLT V2P0 = LLT::vector(2, P0);
+ const LLT V2P1 = LLT::vector(2, P1);
+
+ EXPECT_EQ(S64, S32.changeElementType(S64));
+ EXPECT_EQ(S32, S32.changeElementType(S32));
+
+ EXPECT_EQ(S32, S64.changeElementSize(32));
+ EXPECT_EQ(S32, S32.changeElementSize(32));
+
+ EXPECT_EQ(V2S64, V2S32.changeElementType(S64));
+ EXPECT_EQ(V2S32, V2S64.changeElementType(S32));
+
+ EXPECT_EQ(V2S64, V2S32.changeElementSize(64));
+ EXPECT_EQ(V2S32, V2S64.changeElementSize(32));
+
+ EXPECT_EQ(P0, S32.changeElementType(P0));
+ EXPECT_EQ(S32, P0.changeElementType(S32));
+
+ EXPECT_EQ(V2P1, V2P0.changeElementType(P1));
+ EXPECT_EQ(V2S32, V2P0.changeElementType(S32));
+}
+
+#ifdef GTEST_HAS_DEATH_TEST
+#ifndef NDEBUG
+
+// Invalid to directly change the element size for pointers.
+TEST(LowLevelTypeTest, ChangeElementTypeDeath) {
+ const LLT P0 = LLT::pointer(0, 32);
+ const LLT V2P0 = LLT::vector(2, P0);
+
+ EXPECT_DEATH(P0.changeElementSize(64),
+ "invalid to directly change element size for pointers");
+ EXPECT_DEATH(V2P0.changeElementSize(64),
+ "invalid to directly change element size for pointers");
+
+ // Make sure this still fails even without a change in size.
+ EXPECT_DEATH(P0.changeElementSize(32),
+ "invalid to directly change element size for pointers");
+ EXPECT_DEATH(V2P0.changeElementSize(32),
+ "invalid to directly change element size for pointers");
+}
+
+#endif
+#endif
+
TEST(LowLevelTypeTest, Pointer) {
LLVMContext C;
DataLayout DL("p64:64:64-p127:512:512:512-p16777215:65528:8");
OpenPOWER on IntegriCloud