diff options
Diffstat (limited to 'unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp')
-rw-r--r-- | unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp | 167 |
1 files changed, 85 insertions, 82 deletions
diff --git a/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp b/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp index ca7b47e87eda..42371e63da9d 100644 --- a/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp +++ b/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp @@ -12,22 +12,24 @@ #include "gtest/gtest.h" using namespace llvm; +using namespace LegalizeActions; // Define a couple of pretty printers to help debugging when things go wrong. namespace llvm { std::ostream & -operator<<(std::ostream &OS, const llvm::LegalizerInfo::LegalizeAction Act) { +operator<<(std::ostream &OS, const LegalizeAction Act) { switch (Act) { - case LegalizerInfo::Lower: OS << "Lower"; break; - case LegalizerInfo::Legal: OS << "Legal"; break; - case LegalizerInfo::NarrowScalar: OS << "NarrowScalar"; break; - case LegalizerInfo::WidenScalar: OS << "WidenScalar"; break; - case LegalizerInfo::FewerElements: OS << "FewerElements"; break; - case LegalizerInfo::MoreElements: OS << "MoreElements"; break; - case LegalizerInfo::Libcall: OS << "Libcall"; break; - case LegalizerInfo::Custom: OS << "Custom"; break; - case LegalizerInfo::Unsupported: OS << "Unsupported"; break; - case LegalizerInfo::NotFound: OS << "NotFound"; + case Lower: OS << "Lower"; break; + case Legal: OS << "Legal"; break; + case NarrowScalar: OS << "NarrowScalar"; break; + case WidenScalar: OS << "WidenScalar"; break; + case FewerElements: OS << "FewerElements"; break; + case MoreElements: OS << "MoreElements"; break; + case Libcall: OS << "Libcall"; break; + case Custom: OS << "Custom"; break; + case Unsupported: OS << "Unsupported"; break; + case NotFound: OS << "NotFound"; break; + case UseLegacyRules: OS << "UseLegacyRules"; break; } return OS; } @@ -51,7 +53,7 @@ TEST(LegalizerInfoTest, ScalarRISC) { // Typical RISCy set of operations based on AArch64. for (unsigned Op : {G_ADD, G_SUB}) { for (unsigned Size : {32, 64}) - L.setAction({Op, 0, LLT::scalar(Size)}, LegalizerInfo::Legal); + L.setAction({Op, 0, LLT::scalar(Size)}, Legal); L.setLegalizeScalarToDifferentSizeStrategy( Op, 0, LegalizerInfo::widenToLargerTypesAndNarrowToLargest); } @@ -60,29 +62,29 @@ TEST(LegalizerInfoTest, ScalarRISC) { for (unsigned opcode : {G_ADD, G_SUB}) { // Check we infer the correct types and actually do what we're told. - ASSERT_EQ(L.getAction({opcode, LLT::scalar(8)}), - std::make_pair(LegalizerInfo::WidenScalar, LLT::scalar(32))); - ASSERT_EQ(L.getAction({opcode, LLT::scalar(16)}), - std::make_pair(LegalizerInfo::WidenScalar, LLT::scalar(32))); - ASSERT_EQ(L.getAction({opcode, LLT::scalar(32)}), - std::make_pair(LegalizerInfo::Legal, LLT::scalar(32))); - ASSERT_EQ(L.getAction({opcode, LLT::scalar(64)}), - std::make_pair(LegalizerInfo::Legal, LLT::scalar(64))); + ASSERT_EQ(L.getAction({opcode, {LLT::scalar(8)}}), + LegalizeActionStep(WidenScalar, 0, LLT::scalar(32))); + ASSERT_EQ(L.getAction({opcode, {LLT::scalar(16)}}), + LegalizeActionStep(WidenScalar, 0, LLT::scalar(32))); + ASSERT_EQ(L.getAction({opcode, {LLT::scalar(32)}}), + LegalizeActionStep(Legal, 0, LLT{})); + ASSERT_EQ(L.getAction({opcode, {LLT::scalar(64)}}), + LegalizeActionStep(Legal, 0, LLT{})); // Make sure the default for over-sized types applies. - ASSERT_EQ(L.getAction({opcode, LLT::scalar(128)}), - std::make_pair(LegalizerInfo::NarrowScalar, LLT::scalar(64))); + ASSERT_EQ(L.getAction({opcode, {LLT::scalar(128)}}), + LegalizeActionStep(NarrowScalar, 0, LLT::scalar(64))); // Make sure we also handle unusual sizes - ASSERT_EQ(L.getAction({opcode, LLT::scalar(1)}), - std::make_pair(LegalizerInfo::WidenScalar, LLT::scalar(32))); - ASSERT_EQ(L.getAction({opcode, LLT::scalar(31)}), - std::make_pair(LegalizerInfo::WidenScalar, LLT::scalar(32))); - ASSERT_EQ(L.getAction({opcode, LLT::scalar(33)}), - std::make_pair(LegalizerInfo::WidenScalar, LLT::scalar(64))); - ASSERT_EQ(L.getAction({opcode, LLT::scalar(63)}), - std::make_pair(LegalizerInfo::WidenScalar, LLT::scalar(64))); - ASSERT_EQ(L.getAction({opcode, LLT::scalar(65)}), - std::make_pair(LegalizerInfo::NarrowScalar, LLT::scalar(64))); + ASSERT_EQ(L.getAction({opcode, {LLT::scalar(1)}}), + LegalizeActionStep(WidenScalar, 0, LLT::scalar(32))); + ASSERT_EQ(L.getAction({opcode, {LLT::scalar(31)}}), + LegalizeActionStep(WidenScalar, 0, LLT::scalar(32))); + ASSERT_EQ(L.getAction({opcode, {LLT::scalar(33)}}), + LegalizeActionStep(WidenScalar, 0, LLT::scalar(64))); + ASSERT_EQ(L.getAction({opcode, {LLT::scalar(63)}}), + LegalizeActionStep(WidenScalar, 0, LLT::scalar(64))); + ASSERT_EQ(L.getAction({opcode, {LLT::scalar(65)}}), + LegalizeActionStep(NarrowScalar, 0, LLT::scalar(64))); } } @@ -90,35 +92,35 @@ TEST(LegalizerInfoTest, VectorRISC) { using namespace TargetOpcode; LegalizerInfo L; // Typical RISCy set of operations based on ARM. - L.setAction({G_ADD, LLT::vector(8, 8)}, LegalizerInfo::Legal); - L.setAction({G_ADD, LLT::vector(16, 8)}, LegalizerInfo::Legal); - L.setAction({G_ADD, LLT::vector(4, 16)}, LegalizerInfo::Legal); - L.setAction({G_ADD, LLT::vector(8, 16)}, LegalizerInfo::Legal); - L.setAction({G_ADD, LLT::vector(2, 32)}, LegalizerInfo::Legal); - L.setAction({G_ADD, LLT::vector(4, 32)}, LegalizerInfo::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.setLegalizeVectorElementToDifferentSizeStrategy( G_ADD, 0, LegalizerInfo::widenToLargerTypesUnsupportedOtherwise); - L.setAction({G_ADD, 0, LLT::scalar(32)}, LegalizerInfo::Legal); + L.setAction({G_ADD, 0, LLT::scalar(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({G_ADD, LLT::vector(8, 8)}), - std::make_pair(LegalizerInfo::Legal, LLT::vector(8, 8))); - ASSERT_EQ(L.getAction({G_ADD, LLT::vector(8, 7)}), - std::make_pair(LegalizerInfo::WidenScalar, LLT::vector(8, 8))); - ASSERT_EQ(L.getAction({G_ADD, LLT::vector(2, 8)}), - std::make_pair(LegalizerInfo::MoreElements, LLT::vector(8, 8))); - ASSERT_EQ(L.getAction({G_ADD, LLT::vector(8, 32)}), - std::make_pair(LegalizerInfo::FewerElements, LLT::vector(4, 32))); + ASSERT_EQ(L.getAction({G_ADD, {LLT::vector(8, 8)}}), + LegalizeActionStep(Legal, 0, LLT{})); + ASSERT_EQ(L.getAction({G_ADD, {LLT::vector(8, 7)}}), + LegalizeActionStep(WidenScalar, 0, LLT::vector(8, 8))); + ASSERT_EQ(L.getAction({G_ADD, {LLT::vector(2, 8)}}), + LegalizeActionStep(MoreElements, 0, LLT::vector(8, 8))); + ASSERT_EQ(L.getAction({G_ADD, {LLT::vector(8, 32)}}), + LegalizeActionStep(FewerElements, 0, LLT::vector(4, 32))); // Check a few non-power-of-2 sizes: - ASSERT_EQ(L.getAction({G_ADD, LLT::vector(3, 3)}), - std::make_pair(LegalizerInfo::WidenScalar, LLT::vector(3, 8))); - ASSERT_EQ(L.getAction({G_ADD, LLT::vector(3, 8)}), - std::make_pair(LegalizerInfo::MoreElements, LLT::vector(8, 8))); + ASSERT_EQ(L.getAction({G_ADD, {LLT::vector(3, 3)}}), + LegalizeActionStep(WidenScalar, 0, LLT::vector(3, 8))); + ASSERT_EQ(L.getAction({G_ADD, {LLT::vector(3, 8)}}), + LegalizeActionStep(MoreElements, 0, LLT::vector(8, 8))); } TEST(LegalizerInfoTest, MultipleTypes) { @@ -128,8 +130,8 @@ TEST(LegalizerInfoTest, MultipleTypes) { LLT s64 = LLT::scalar(64); // Typical RISCy set of operations based on AArch64. - L.setAction({G_PTRTOINT, 0, s64}, LegalizerInfo::Legal); - L.setAction({G_PTRTOINT, 1, p0}, LegalizerInfo::Legal); + L.setAction({G_PTRTOINT, 0, s64}, Legal); + L.setAction({G_PTRTOINT, 1, p0}, Legal); L.setLegalizeScalarToDifferentSizeStrategy( G_PTRTOINT, 0, LegalizerInfo::widenToLargerTypesAndNarrowToLargest); @@ -137,15 +139,16 @@ TEST(LegalizerInfoTest, MultipleTypes) { L.computeTables(); // Check we infer the correct types and actually do what we're told. - ASSERT_EQ(L.getAction({G_PTRTOINT, 0, s64}), - std::make_pair(LegalizerInfo::Legal, s64)); - ASSERT_EQ(L.getAction({G_PTRTOINT, 1, p0}), - std::make_pair(LegalizerInfo::Legal, p0)); + ASSERT_EQ(L.getAction({G_PTRTOINT, {s64, p0}}), + LegalizeActionStep(Legal, 0, LLT{})); + // Make sure we also handle unusual sizes - ASSERT_EQ(L.getAction({G_PTRTOINT, 0, LLT::scalar(65)}), - std::make_pair(LegalizerInfo::NarrowScalar, s64)); - ASSERT_EQ(L.getAction({G_PTRTOINT, 1, LLT::pointer(0, 32)}), - std::make_pair(LegalizerInfo::Unsupported, LLT::pointer(0, 32))); + ASSERT_EQ( + L.getAction({G_PTRTOINT, {LLT::scalar(65), s64}}), + LegalizeActionStep(NarrowScalar, 0, s64)); + ASSERT_EQ( + L.getAction({G_PTRTOINT, {s64, LLT::pointer(0, 32)}}), + LegalizeActionStep(Unsupported, 1, LLT::pointer(0, 32))); } TEST(LegalizerInfoTest, MultipleSteps) { @@ -156,22 +159,22 @@ TEST(LegalizerInfoTest, MultipleSteps) { L.setLegalizeScalarToDifferentSizeStrategy( G_UREM, 0, LegalizerInfo::widenToLargerTypesUnsupportedOtherwise); - L.setAction({G_UREM, 0, s32}, LegalizerInfo::Lower); - L.setAction({G_UREM, 0, s64}, LegalizerInfo::Lower); + L.setAction({G_UREM, 0, s32}, Lower); + L.setAction({G_UREM, 0, s64}, Lower); L.computeTables(); - ASSERT_EQ(L.getAction({G_UREM, LLT::scalar(16)}), - std::make_pair(LegalizerInfo::WidenScalar, LLT::scalar(32))); - ASSERT_EQ(L.getAction({G_UREM, LLT::scalar(32)}), - std::make_pair(LegalizerInfo::Lower, LLT::scalar(32))); + ASSERT_EQ(L.getAction({G_UREM, {LLT::scalar(16)}}), + LegalizeActionStep(WidenScalar, 0, LLT::scalar(32))); + ASSERT_EQ(L.getAction({G_UREM, {LLT::scalar(32)}}), + LegalizeActionStep(Lower, 0, LLT::scalar(32))); } TEST(LegalizerInfoTest, SizeChangeStrategy) { using namespace TargetOpcode; LegalizerInfo L; for (unsigned Size : {1, 8, 16, 32}) - L.setAction({G_UREM, 0, LLT::scalar(Size)}, LegalizerInfo::Legal); + L.setAction({G_UREM, 0, LLT::scalar(Size)}, Legal); L.setLegalizeScalarToDifferentSizeStrategy( G_UREM, 0, LegalizerInfo::widenToLargerTypesUnsupportedOtherwise); @@ -179,20 +182,20 @@ TEST(LegalizerInfoTest, SizeChangeStrategy) { // Check we infer the correct types and actually do what we're told. for (unsigned Size : {1, 8, 16, 32}) { - ASSERT_EQ(L.getAction({G_UREM, LLT::scalar(Size)}), - std::make_pair(LegalizerInfo::Legal, LLT::scalar(Size))); + ASSERT_EQ(L.getAction({G_UREM, {LLT::scalar(Size)}}), + LegalizeActionStep(Legal, 0, LLT{})); } - ASSERT_EQ(L.getAction({G_UREM, LLT::scalar(2)}), - std::make_pair(LegalizerInfo::WidenScalar, LLT::scalar(8))); - ASSERT_EQ(L.getAction({G_UREM, LLT::scalar(7)}), - std::make_pair(LegalizerInfo::WidenScalar, LLT::scalar(8))); - ASSERT_EQ(L.getAction({G_UREM, LLT::scalar(9)}), - std::make_pair(LegalizerInfo::WidenScalar, LLT::scalar(16))); - ASSERT_EQ(L.getAction({G_UREM, LLT::scalar(17)}), - std::make_pair(LegalizerInfo::WidenScalar, LLT::scalar(32))); - ASSERT_EQ(L.getAction({G_UREM, LLT::scalar(31)}), - std::make_pair(LegalizerInfo::WidenScalar, LLT::scalar(32))); - ASSERT_EQ(L.getAction({G_UREM, LLT::scalar(33)}), - std::make_pair(LegalizerInfo::Unsupported, LLT::scalar(33))); + ASSERT_EQ(L.getAction({G_UREM, {LLT::scalar(2)}}), + LegalizeActionStep(WidenScalar, 0, LLT::scalar(8))); + ASSERT_EQ(L.getAction({G_UREM, {LLT::scalar(7)}}), + LegalizeActionStep(WidenScalar, 0, LLT::scalar(8))); + ASSERT_EQ(L.getAction({G_UREM, {LLT::scalar(9)}}), + LegalizeActionStep(WidenScalar, 0, LLT::scalar(16))); + ASSERT_EQ(L.getAction({G_UREM, {LLT::scalar(17)}}), + LegalizeActionStep(WidenScalar, 0, LLT::scalar(32))); + ASSERT_EQ(L.getAction({G_UREM, {LLT::scalar(31)}}), + LegalizeActionStep(WidenScalar, 0, LLT::scalar(32))); + ASSERT_EQ(L.getAction({G_UREM, {LLT::scalar(33)}}), + LegalizeActionStep(Unsupported, 0, LLT::scalar(33))); } } |