From 733c08b6b3bc64ccca2a9e7f3d67b6179ac3f346 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Mon, 4 Feb 2019 22:26:33 +0000 Subject: GlobalISel: Fix not calling observer when legalizing bitcount ops This was hiding bugs from never legalizing the source type. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353102 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../CodeGen/GlobalISel/LegalizerHelperTest.cpp | 65 ++++++++++++++++++++++ 1 file changed, 65 insertions(+) (limited to 'unittests') diff --git a/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp b/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp index 815f1e3d321..a9c9a938db5 100644 --- a/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp +++ b/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) -- cgit v1.2.3