summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/CodeGen
diff options
context:
space:
mode:
authorTim Northover <tnorthover@apple.com>2016-08-23 19:30:42 +0000
committerTim Northover <tnorthover@apple.com>2016-08-23 19:30:42 +0000
commita01bece1dcbc95cb7e99421e050e27e231f6e995 (patch)
tree5b0ef12375f4e0239428c888fd4134938ee03076 /llvm/unittests/CodeGen
parent456a3c03aceab17fff31eddbae9f8478dc4e3025 (diff)
downloadbcm5719-llvm-a01bece1dcbc95cb7e99421e050e27e231f6e995.tar.gz
bcm5719-llvm-a01bece1dcbc95cb7e99421e050e27e231f6e995.zip
GlobalISel: extend legalizer interface to handle multiple types.
Instructions like G_ICMP have multiple types that may need to be legalized (the boolean output and nearly arbitrary inputs in this case). So the legalizer must be capable of deciding what to do for each of them separately. llvm-svn: 279554
Diffstat (limited to 'llvm/unittests/CodeGen')
-rw-r--r--llvm/unittests/CodeGen/GlobalISel/MachineLegalizerTest.cpp64
1 files changed, 42 insertions, 22 deletions
diff --git a/llvm/unittests/CodeGen/GlobalISel/MachineLegalizerTest.cpp b/llvm/unittests/CodeGen/GlobalISel/MachineLegalizerTest.cpp
index 5f217623cac..946f3b4c0c9 100644
--- a/llvm/unittests/CodeGen/GlobalISel/MachineLegalizerTest.cpp
+++ b/llvm/unittests/CodeGen/GlobalISel/MachineLegalizerTest.cpp
@@ -52,51 +52,71 @@ namespace {
TEST(MachineLegalizerTest, ScalarRISC) {
+ using namespace TargetOpcode;
MachineLegalizer L;
// Typical RISCy set of operations based on AArch64.
- L.setAction(TargetOpcode::G_ADD, LLT::scalar(8), WidenScalar);
- L.setAction(TargetOpcode::G_ADD, LLT::scalar(16), WidenScalar);
- L.setAction(TargetOpcode::G_ADD, LLT::scalar(32), Legal);
- L.setAction(TargetOpcode::G_ADD, LLT::scalar(64), Legal);
+ L.setAction({G_ADD, LLT::scalar(8)}, WidenScalar);
+ L.setAction({G_ADD, LLT::scalar(16)}, WidenScalar);
+ L.setAction({G_ADD, LLT::scalar(32)}, Legal);
+ L.setAction({G_ADD, LLT::scalar(64)}, Legal);
L.computeTables();
// Check we infer the correct types and actually do what we're told.
- ASSERT_EQ(L.getAction(TargetOpcode::G_ADD, LLT::scalar(8)),
+ ASSERT_EQ(L.getAction({G_ADD, LLT::scalar(8)}),
std::make_pair(WidenScalar, LLT::scalar(32)));
- ASSERT_EQ(L.getAction(TargetOpcode::G_ADD, LLT::scalar(16)),
+ ASSERT_EQ(L.getAction({G_ADD, LLT::scalar(16)}),
std::make_pair(WidenScalar, LLT::scalar(32)));
- ASSERT_EQ(L.getAction(TargetOpcode::G_ADD, LLT::scalar(32)),
+ ASSERT_EQ(L.getAction({G_ADD, LLT::scalar(32)}),
std::make_pair(Legal, LLT::scalar(32)));
- ASSERT_EQ(L.getAction(TargetOpcode::G_ADD, LLT::scalar(64)),
+ ASSERT_EQ(L.getAction({G_ADD, LLT::scalar(64)}),
std::make_pair(Legal, LLT::scalar(64)));
// Make sure the default for over-sized types applies.
- ASSERT_EQ(L.getAction(TargetOpcode::G_ADD, LLT::scalar(128)),
+ ASSERT_EQ(L.getAction({G_ADD, LLT::scalar(128)}),
std::make_pair(NarrowScalar, LLT::scalar(64)));
}
TEST(MachineLegalizerTest, VectorRISC) {
+ using namespace TargetOpcode;
MachineLegalizer L;
// Typical RISCy set of operations based on ARM.
- L.setScalarInVectorAction(TargetOpcode::G_ADD, LLT::scalar(8), Legal);
- L.setScalarInVectorAction(TargetOpcode::G_ADD, LLT::scalar(16), Legal);
- L.setScalarInVectorAction(TargetOpcode::G_ADD, LLT::scalar(32), Legal);
-
- L.setAction(TargetOpcode::G_ADD, LLT::vector(8, 8), Legal);
- L.setAction(TargetOpcode::G_ADD, LLT::vector(16, 8), Legal);
- L.setAction(TargetOpcode::G_ADD, LLT::vector(4, 16), Legal);
- L.setAction(TargetOpcode::G_ADD, LLT::vector(8, 16), Legal);
- L.setAction(TargetOpcode::G_ADD, LLT::vector(2, 32), Legal);
- L.setAction(TargetOpcode::G_ADD, LLT::vector(4, 32), Legal);
+ L.setScalarInVectorAction(G_ADD, LLT::scalar(8), Legal);
+ L.setScalarInVectorAction(G_ADD, LLT::scalar(16), Legal);
+ L.setScalarInVectorAction(G_ADD, LLT::scalar(32), Legal);
+
+ L.setAction({G_ADD, LLT::vector(8, 8)}, Legal);
+ L.setAction({G_ADD, LLT::vector(16, 8)}, Legal);
+ L.setAction({G_ADD, LLT::vector(4, 16)}, Legal);
+ L.setAction({G_ADD, LLT::vector(8, 16)}, Legal);
+ L.setAction({G_ADD, LLT::vector(2, 32)}, Legal);
+ L.setAction({G_ADD, LLT::vector(4, 32)}, Legal);
L.computeTables();
// Check we infer the correct types and actually do what we're told for some
// simple cases.
- ASSERT_EQ(L.getAction(TargetOpcode::G_ADD, LLT::vector(2, 8)),
+ ASSERT_EQ(L.getAction({G_ADD, LLT::vector(2, 8)}),
std::make_pair(MoreElements, LLT::vector(8, 8)));
- ASSERT_EQ(L.getAction(TargetOpcode::G_ADD, LLT::vector(8, 8)),
+ ASSERT_EQ(L.getAction({G_ADD, LLT::vector(8, 8)}),
std::make_pair(Legal, LLT::vector(8, 8)));
- ASSERT_EQ(L.getAction(TargetOpcode::G_ADD, LLT::vector(8, 32)),
+ ASSERT_EQ(L.getAction({G_ADD, LLT::vector(8, 32)}),
std::make_pair(FewerElements, LLT::vector(4, 32)));
}
+
+TEST(MachineLegalizerTest, MultipleTypes) {
+ using namespace TargetOpcode;
+ MachineLegalizer L;
+
+ // Typical RISCy set of operations based on AArch64.
+ L.setAction({G_PTRTOINT, 0, LLT::scalar(64)}, Legal);
+ L.setAction({G_PTRTOINT, 1, LLT::pointer(0)}, Legal);
+
+ L.setAction({G_PTRTOINT, 0, LLT::scalar(32)}, WidenScalar);
+ L.computeTables();
+
+ // Check we infer the correct types and actually do what we're told.
+ ASSERT_EQ(L.getAction({G_PTRTOINT, 0, LLT::scalar(64)}),
+ std::make_pair(Legal, LLT::scalar(64)));
+ ASSERT_EQ(L.getAction({G_PTRTOINT, 1, LLT::pointer(0)}),
+ std::make_pair(Legal, LLT::pointer(0)));
+}
}
OpenPOWER on IntegriCloud