diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-02-04 22:26:33 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-02-04 22:26:33 +0000 |
commit | 3d6a49b0b91016653259a7281d6a13abe2d3450e (patch) | |
tree | 3bd79f1284bfff39d5a0ea012088b9a77a947053 /llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp | |
parent | cba0c6d0c9d2c610c566e4b46b8f0315a2cfebbc (diff) | |
download | bcm5719-llvm-3d6a49b0b91016653259a7281d6a13abe2d3450e.tar.gz bcm5719-llvm-3d6a49b0b91016653259a7281d6a13abe2d3450e.zip |
GlobalISel: Fix not calling observer when legalizing bitcount ops
This was hiding bugs from never legalizing the source type.
llvm-svn: 353102
Diffstat (limited to 'llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp')
-rw-r--r-- | llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp b/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp index 815f1e3d321..a9c9a938db5 100644 --- a/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp +++ b/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp @@ -114,6 +114,71 @@ TEST_F(GISelMITest, LowerBitCountingCTTZ2) { EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; } +// CTPOP widening. +TEST_F(GISelMITest, WidenBitCountingCTPOP1) { + if (!TM) + return; + + // Declare your legalization info + DefineLegalizerInfo(A, { + getActionDefinitionsBuilder(G_CTPOP).legalFor({{s16, s16}}); + }); + + // Build + // Trunc it to s8. + LLT s8{LLT::scalar(8)}; + LLT s16{LLT::scalar(16)}; + auto MIBTrunc = B.buildTrunc(s8, Copies[0]); + auto MIBCTPOP = B.buildInstr(TargetOpcode::G_CTPOP, {s16}, {MIBTrunc}); + AInfo Info(MF->getSubtarget()); + DummyGISelObserver Observer; + LegalizerHelper Helper(*MF, Info, Observer, B); + EXPECT_EQ(LegalizerHelper::LegalizeResult::Legalized, + Helper.widenScalar(*MIBCTPOP, 1, s16)); + + auto CheckStr = R"( + CHECK: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC %0:_(s64) + CHECK: [[ZEXT:%[0-9]+]]:_(s16) = G_ZEXT [[TRUNC]]:_(s8) + CHECK: [[CTPOP:%[0-9]+]]:_(s16) = G_CTPOP [[ZEXT]] + CHECK: [[COPY:%[0-9]+]]:_(s16) = COPY [[CTPOP]]:_(s16) + )"; + + EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; +} + +// Test a strange case where the result is wider than the source +TEST_F(GISelMITest, WidenBitCountingCTPOP2) { + if (!TM) + return; + + // Declare your legalization info + DefineLegalizerInfo(A, { + getActionDefinitionsBuilder(G_CTPOP).legalFor({{s32, s16}}); + }); + + // Build + // Trunc it to s8. + LLT s8{LLT::scalar(8)}; + LLT s16{LLT::scalar(16)}; + LLT s32{LLT::scalar(32)}; + auto MIBTrunc = B.buildTrunc(s8, Copies[0]); + auto MIBCTPOP = B.buildInstr(TargetOpcode::G_CTPOP, {s32}, {MIBTrunc}); + AInfo Info(MF->getSubtarget()); + DummyGISelObserver Observer; + LegalizerHelper Helper(*MF, Info, Observer, B); + EXPECT_EQ(LegalizerHelper::LegalizeResult::Legalized, + Helper.widenScalar(*MIBCTPOP, 1, s16)); + + auto CheckStr = R"( + CHECK: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC %0:_(s64) + CHECK: [[ZEXT:%[0-9]+]]:_(s16) = G_ZEXT [[TRUNC]]:_(s8) + CHECK: [[CTPOP:%[0-9]+]]:_(s16) = G_CTPOP [[ZEXT]] + CHECK: [[COPY:%[0-9]+]]:_(s32) = G_ZEXT [[CTPOP]]:_(s16) + )"; + + EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF; +} + // CTTZ_ZERO_UNDEF expansion in terms of CTTZ TEST_F(GISelMITest, LowerBitCountingCTTZ3) { if (!TM) |