Index: unittests/CodeGen/GlobalISel/CMakeLists.txt =================================================================== --- unittests/CodeGen/GlobalISel/CMakeLists.txt +++ unittests/CodeGen/GlobalISel/CMakeLists.txt @@ -14,5 +14,6 @@ LegalizerHelperTest.cpp LegalizerInfoTest.cpp MachineIRBuilderTest.cpp + GISelMITest.cpp PatternMatchTest.cpp ) Index: unittests/CodeGen/GlobalISel/GISelMITest.h =================================================================== --- unittests/CodeGen/GlobalISel/GISelMITest.h +++ unittests/CodeGen/GlobalISel/GISelMITest.h @@ -43,6 +43,15 @@ initializeCodeGen(*Registry); } +// Define a printers to help debugging when things go wrong. +namespace llvm { +std::ostream & +operator<<(std::ostream &OS, const LLT Ty); + +std::ostream & +operator<<(std::ostream &OS, const MachineFunction &MF); +} + /// Create a TargetMachine. As we lack a dedicated always available target for /// unittests, we go for "AArch64". static std::unique_ptr createTargetMachine() { Index: unittests/CodeGen/GlobalISel/GISelMITest.cpp =================================================================== --- /dev/null +++ unittests/CodeGen/GlobalISel/GISelMITest.cpp @@ -0,0 +1,30 @@ +//===------------------------------------------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "GISelMITest.h" + +namespace llvm { +std::ostream & +operator<<(std::ostream &OS, const LLT Ty) { + std::string Repr; + raw_string_ostream SS{Repr}; + Ty.print(SS); + OS << SS.str(); + return OS; +} + +std::ostream & +operator<<(std::ostream &OS, const MachineFunction &MF) { + std::string Repr; + raw_string_ostream SS{Repr}; + MF.print(SS); + OS << SS.str(); + return OS; +} + +} Index: unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp =================================================================== --- unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp +++ unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp @@ -36,7 +36,7 @@ DummyGISelObserver Observer; LegalizerHelper Helper(*MF, Info, Observer, B); // Perform Legalization - ASSERT_TRUE(Helper.lower(*MIBCTTZ, 0, LLT::scalar(64)) == + EXPECT_TRUE(Helper.lower(*MIBCTTZ, 0, LLT::scalar(64)) == LegalizerHelper::LegalizeResult::Legalized); auto CheckStr = R"( @@ -48,7 +48,7 @@ )"; // Check - ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr)); + EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; } // CTTZ expansion in terms of CTLZ @@ -67,7 +67,7 @@ DummyGISelObserver Observer; LegalizerHelper Helper(*MF, Info, Observer, B); // Perform Legalization - ASSERT_TRUE(Helper.lower(*MIBCTTZ, 0, LLT::scalar(64)) == + EXPECT_TRUE(Helper.lower(*MIBCTTZ, 0, LLT::scalar(64)) == LegalizerHelper::LegalizeResult::Legalized); auto CheckStr = R"( @@ -81,7 +81,7 @@ )"; // Check - ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr)); + EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; } // CTTZ expansion in terms of CTPOP @@ -99,7 +99,7 @@ AInfo Info(MF->getSubtarget()); DummyGISelObserver Observer; LegalizerHelper Helper(*MF, Info, Observer, B); - ASSERT_TRUE(Helper.lower(*MIBCTTZ, 0, LLT::scalar(64)) == + EXPECT_TRUE(Helper.lower(*MIBCTTZ, 0, LLT::scalar(64)) == LegalizerHelper::LegalizeResult::Legalized); auto CheckStr = R"( @@ -111,7 +111,7 @@ )"; // Check - ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr)); + EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; } // CTTZ_ZERO_UNDEF expansion in terms of CTTZ @@ -129,7 +129,7 @@ AInfo Info(MF->getSubtarget()); DummyGISelObserver Observer; LegalizerHelper Helper(*MF, Info, Observer, B); - ASSERT_TRUE(Helper.lower(*MIBCTTZ, 0, LLT::scalar(64)) == + EXPECT_TRUE(Helper.lower(*MIBCTTZ, 0, LLT::scalar(64)) == LegalizerHelper::LegalizeResult::Legalized); auto CheckStr = R"( @@ -137,7 +137,7 @@ )"; // Check - ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr)); + EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; } // CTLZ expansion in terms of CTLZ_ZERO_UNDEF @@ -155,7 +155,7 @@ AInfo Info(MF->getSubtarget()); DummyGISelObserver Observer; LegalizerHelper Helper(*MF, Info, Observer, B); - ASSERT_TRUE(Helper.lower(*MIBCTLZ, 0, LLT::scalar(64)) == + EXPECT_TRUE(Helper.lower(*MIBCTLZ, 0, LLT::scalar(64)) == LegalizerHelper::LegalizeResult::Legalized); auto CheckStr = R"( @@ -167,7 +167,7 @@ )"; // Check - ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr)); + EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; } // CTLZ expansion in terms of CTLZ_ZERO_UNDEF if the latter is a libcall @@ -185,7 +185,7 @@ AInfo Info(MF->getSubtarget()); DummyGISelObserver Observer; LegalizerHelper Helper(*MF, Info, Observer, B); - ASSERT_TRUE(Helper.lower(*MIBCTLZ, 0, LLT::scalar(64)) == + EXPECT_TRUE(Helper.lower(*MIBCTLZ, 0, LLT::scalar(64)) == LegalizerHelper::LegalizeResult::Legalized); auto CheckStr = R"( @@ -197,7 +197,7 @@ )"; // Check - ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr)); + EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; } // CTLZ expansion @@ -217,7 +217,7 @@ AInfo Info(MF->getSubtarget()); DummyGISelObserver Observer; LegalizerHelper Helper(*MF, Info, Observer, B); - ASSERT_TRUE(Helper.lower(*MIBCTLZ, 0, s8) == + EXPECT_TRUE(Helper.lower(*MIBCTLZ, 0, s8) == LegalizerHelper::LegalizeResult::Legalized); auto CheckStr = R"( @@ -237,7 +237,7 @@ )"; // Check - ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr)); + EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; } // CTLZ widening. @@ -258,7 +258,7 @@ AInfo Info(MF->getSubtarget()); DummyGISelObserver Observer; LegalizerHelper Helper(*MF, Info, Observer, B); - ASSERT_TRUE(Helper.widenScalar(*MIBCTLZ, 1, s16) == + EXPECT_TRUE(Helper.widenScalar(*MIBCTLZ, 1, s16) == LegalizerHelper::LegalizeResult::Legalized); auto CheckStr = R"( @@ -271,7 +271,7 @@ )"; // Check - ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr)); + EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; } // CTLZ_ZERO_UNDEF widening. @@ -293,7 +293,7 @@ AInfo Info(MF->getSubtarget()); DummyGISelObserver Observer; LegalizerHelper Helper(*MF, Info, Observer, B); - ASSERT_TRUE(Helper.widenScalar(*MIBCTLZ_ZU, 1, s16) == + EXPECT_TRUE(Helper.widenScalar(*MIBCTLZ_ZU, 1, s16) == LegalizerHelper::LegalizeResult::Legalized); auto CheckStr = R"( @@ -306,7 +306,7 @@ )"; // Check - ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr)); + EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; } // CTPOP widening. @@ -327,7 +327,7 @@ AInfo Info(MF->getSubtarget()); DummyGISelObserver Observer; LegalizerHelper Helper(*MF, Info, Observer, B); - ASSERT_TRUE(Helper.widenScalar(*MIBCTPOP, 1, s16) == + EXPECT_TRUE(Helper.widenScalar(*MIBCTPOP, 1, s16) == LegalizerHelper::LegalizeResult::Legalized); auto CheckStr = R"( @@ -338,7 +338,7 @@ )"; // Check - ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr)); + EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; } // CTTZ_ZERO_UNDEF widening. @@ -360,7 +360,7 @@ AInfo Info(MF->getSubtarget()); DummyGISelObserver Observer; LegalizerHelper Helper(*MF, Info, Observer, B); - ASSERT_TRUE(Helper.widenScalar(*MIBCTTZ_ZERO_UNDEF, 1, s16) == + EXPECT_TRUE(Helper.widenScalar(*MIBCTTZ_ZERO_UNDEF, 1, s16) == LegalizerHelper::LegalizeResult::Legalized); auto CheckStr = R"( @@ -371,7 +371,7 @@ )"; // Check - ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr)); + EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; } // CTTZ widening. @@ -392,7 +392,7 @@ AInfo Info(MF->getSubtarget()); DummyGISelObserver Observer; LegalizerHelper Helper(*MF, Info, Observer, B); - ASSERT_TRUE(Helper.widenScalar(*MIBCTTZ, 1, s16) == + EXPECT_TRUE(Helper.widenScalar(*MIBCTTZ, 1, s16) == LegalizerHelper::LegalizeResult::Legalized); auto CheckStr = R"( @@ -405,7 +405,7 @@ )"; // Check - ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr)); + EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; } // UADDO widening. TEST_F(GISelMITest, WidenUADDO) { @@ -427,7 +427,7 @@ AInfo Info(MF->getSubtarget()); DummyGISelObserver Observer; LegalizerHelper Helper(*MF, Info, Observer, B); - ASSERT_TRUE(Helper.widenScalar(*MIBUAddO, 0, s16) == + EXPECT_TRUE(Helper.widenScalar(*MIBUAddO, 0, s16) == LegalizerHelper::LegalizeResult::Legalized); auto CheckStr = R"( @@ -442,7 +442,7 @@ )"; // Check - ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr)); + EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; } // USUBO widening. @@ -465,7 +465,7 @@ AInfo Info(MF->getSubtarget()); DummyGISelObserver Observer; LegalizerHelper Helper(*MF, Info, Observer, B); - ASSERT_TRUE(Helper.widenScalar(*MIBUSUBO, 0, s16) == + EXPECT_TRUE(Helper.widenScalar(*MIBUSUBO, 0, s16) == LegalizerHelper::LegalizeResult::Legalized); auto CheckStr = R"( @@ -480,6 +480,6 @@ )"; // Check - ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr)); + EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; } } // namespace Index: unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp =================================================================== --- unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp +++ unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp @@ -8,6 +8,7 @@ #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h" #include "llvm/CodeGen/TargetOpcodes.h" +#include "GISelMITest.h" #include "gtest/gtest.h" using namespace llvm; @@ -33,15 +34,6 @@ return OS; } -std::ostream & -operator<<(std::ostream &OS, const llvm::LLT Ty) { - std::string Repr; - raw_string_ostream SS{Repr}; - Ty.print(SS); - OS << SS.str(); - return OS; -} - std::ostream &operator<<(std::ostream &OS, const llvm::LegalizeActionStep Ty) { OS << "LegalizeActionStep(" << Ty.Action << ", " << Ty.TypeIdx << ", " << Ty.NewType << ')'; @@ -67,28 +59,28 @@ 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)}}), + EXPECT_EQ(L.getAction({opcode, {LLT::scalar(8)}}), LegalizeActionStep(WidenScalar, 0, LLT::scalar(32))); - ASSERT_EQ(L.getAction({opcode, {LLT::scalar(16)}}), + EXPECT_EQ(L.getAction({opcode, {LLT::scalar(16)}}), LegalizeActionStep(WidenScalar, 0, LLT::scalar(32))); - ASSERT_EQ(L.getAction({opcode, {LLT::scalar(32)}}), + EXPECT_EQ(L.getAction({opcode, {LLT::scalar(32)}}), LegalizeActionStep(Legal, 0, LLT{})); - ASSERT_EQ(L.getAction({opcode, {LLT::scalar(64)}}), + EXPECT_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)}}), + EXPECT_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)}}), + EXPECT_EQ(L.getAction({opcode, {LLT::scalar(1)}}), LegalizeActionStep(WidenScalar, 0, LLT::scalar(32))); - ASSERT_EQ(L.getAction({opcode, {LLT::scalar(31)}}), + EXPECT_EQ(L.getAction({opcode, {LLT::scalar(31)}}), LegalizeActionStep(WidenScalar, 0, LLT::scalar(32))); - ASSERT_EQ(L.getAction({opcode, {LLT::scalar(33)}}), + EXPECT_EQ(L.getAction({opcode, {LLT::scalar(33)}}), LegalizeActionStep(WidenScalar, 0, LLT::scalar(64))); - ASSERT_EQ(L.getAction({opcode, {LLT::scalar(63)}}), + EXPECT_EQ(L.getAction({opcode, {LLT::scalar(63)}}), LegalizeActionStep(WidenScalar, 0, LLT::scalar(64))); - ASSERT_EQ(L.getAction({opcode, {LLT::scalar(65)}}), + EXPECT_EQ(L.getAction({opcode, {LLT::scalar(65)}}), LegalizeActionStep(NarrowScalar, 0, LLT::scalar(64))); } } @@ -113,18 +105,18 @@ // 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)}}), + EXPECT_EQ(L.getAction({G_ADD, {LLT::vector(8, 8)}}), LegalizeActionStep(Legal, 0, LLT{})); - ASSERT_EQ(L.getAction({G_ADD, {LLT::vector(8, 7)}}), + EXPECT_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)}}), + EXPECT_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)}}), + EXPECT_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)}}), + EXPECT_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)}}), + EXPECT_EQ(L.getAction({G_ADD, {LLT::vector(3, 8)}}), LegalizeActionStep(MoreElements, 0, LLT::vector(8, 8))); } @@ -144,14 +136,14 @@ L.computeTables(); // Check we infer the correct types and actually do what we're told. - ASSERT_EQ(L.getAction({G_PTRTOINT, {s64, p0}}), + EXPECT_EQ(L.getAction({G_PTRTOINT, {s64, p0}}), LegalizeActionStep(Legal, 0, LLT{})); // Make sure we also handle unusual sizes - ASSERT_EQ( + EXPECT_EQ( L.getAction({G_PTRTOINT, {LLT::scalar(65), s64}}), LegalizeActionStep(NarrowScalar, 0, s64)); - ASSERT_EQ( + EXPECT_EQ( L.getAction({G_PTRTOINT, {s64, LLT::pointer(0, 32)}}), LegalizeActionStep(Unsupported, 1, LLT::pointer(0, 32))); } @@ -169,9 +161,9 @@ L.computeTables(); - ASSERT_EQ(L.getAction({G_UREM, {LLT::scalar(16)}}), + EXPECT_EQ(L.getAction({G_UREM, {LLT::scalar(16)}}), LegalizeActionStep(WidenScalar, 0, LLT::scalar(32))); - ASSERT_EQ(L.getAction({G_UREM, {LLT::scalar(32)}}), + EXPECT_EQ(L.getAction({G_UREM, {LLT::scalar(32)}}), LegalizeActionStep(Lower, 0, LLT::scalar(32))); } @@ -187,20 +179,20 @@ // 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)}}), + EXPECT_EQ(L.getAction({G_UREM, {LLT::scalar(Size)}}), LegalizeActionStep(Legal, 0, LLT{})); } - ASSERT_EQ(L.getAction({G_UREM, {LLT::scalar(2)}}), + EXPECT_EQ(L.getAction({G_UREM, {LLT::scalar(2)}}), LegalizeActionStep(WidenScalar, 0, LLT::scalar(8))); - ASSERT_EQ(L.getAction({G_UREM, {LLT::scalar(7)}}), + EXPECT_EQ(L.getAction({G_UREM, {LLT::scalar(7)}}), LegalizeActionStep(WidenScalar, 0, LLT::scalar(8))); - ASSERT_EQ(L.getAction({G_UREM, {LLT::scalar(9)}}), + EXPECT_EQ(L.getAction({G_UREM, {LLT::scalar(9)}}), LegalizeActionStep(WidenScalar, 0, LLT::scalar(16))); - ASSERT_EQ(L.getAction({G_UREM, {LLT::scalar(17)}}), + EXPECT_EQ(L.getAction({G_UREM, {LLT::scalar(17)}}), LegalizeActionStep(WidenScalar, 0, LLT::scalar(32))); - ASSERT_EQ(L.getAction({G_UREM, {LLT::scalar(31)}}), + EXPECT_EQ(L.getAction({G_UREM, {LLT::scalar(31)}}), LegalizeActionStep(WidenScalar, 0, LLT::scalar(32))); - ASSERT_EQ(L.getAction({G_UREM, {LLT::scalar(33)}}), + EXPECT_EQ(L.getAction({G_UREM, {LLT::scalar(33)}}), LegalizeActionStep(Unsupported, 0, LLT::scalar(33))); } } Index: unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp =================================================================== --- unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp +++ unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp @@ -26,10 +26,9 @@ CHECK: [[VEC0:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[CONST1]]:_(s32), [[CONST1]]:_(s32) CHECK: [[FCONST1:%[0-9]+]]:_(s32) = G_FCONSTANT float 2.000000e+00 CHECK: [[VEC1:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[FCONST1]]:_(s32), [[FCONST1]]:_(s32) - )"; - ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr)); + EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; } Index: unittests/CodeGen/LowLevelTypeTest.cpp =================================================================== --- unittests/CodeGen/LowLevelTypeTest.cpp +++ unittests/CodeGen/LowLevelTypeTest.cpp @@ -15,18 +15,6 @@ using namespace llvm; -// Define a pretty printer to help debugging when things go wrong. -namespace llvm { -std::ostream & -operator<<(std::ostream &OS, const llvm::LLT Ty) { - std::string Repr; - raw_string_ostream SS{Repr}; - Ty.print(SS); - OS << SS.str(); - return OS; -} -} - namespace { TEST(LowLevelTypeTest, Scalar) {