diff options
| author | Aditya Nandakumar <aditya_nandakumar@apple.com> | 2018-08-29 03:17:08 +0000 |
|---|---|---|
| committer | Aditya Nandakumar <aditya_nandakumar@apple.com> | 2018-08-29 03:17:08 +0000 |
| commit | 6d47a415204a066a0a6b52525240d57f9cb339bf (patch) | |
| tree | 7de080b80380ded702c5d8ef6a3e16ad383e149c /llvm/unittests | |
| parent | 9f42726cc79d4fa5f069bb2242a97ed1426ae20a (diff) | |
| download | bcm5719-llvm-6d47a415204a066a0a6b52525240d57f9cb339bf.tar.gz bcm5719-llvm-6d47a415204a066a0a6b52525240d57f9cb339bf.zip | |
[GISel]: Add legalization support for Widening UADDO/USUBO
https://reviews.llvm.org/D51384
Added code in LegalizerHelper to widen UADDO/USUBO along with unit
tests.
Reviewed by volkan.
llvm-svn: 340892
Diffstat (limited to 'llvm/unittests')
| -rw-r--r-- | llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp b/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp index 65d0d73166a..0cc989be3c0 100644 --- a/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp +++ b/llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp @@ -342,4 +342,79 @@ TEST_F(LegalizerHelperTest, WidenBitCountingCTTZ) { // Check ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr)); } +// UADDO widening. +TEST_F(LegalizerHelperTest, WidenUADDO) { + if (!TM) + return; + + // Declare your legalization info + DefineLegalizerInfo(A, + { getActionDefinitionsBuilder(G_ADD).legalFor({s16}); }); + // Build + // Trunc it to s8. + LLT s8{LLT::scalar(8)}; + LLT s16{LLT::scalar(16)}; + auto MIBTrunc = B.buildTrunc(s8, Copies[0]); + unsigned CarryReg = MRI->createGenericVirtualRegister(LLT::scalar(1)); + auto MIBUAddO = B.buildInstr(TargetOpcode::G_UADDO, s8) + .addDef(CarryReg) + .addUse(MIBTrunc->getOperand(0).getReg()) + .addUse(MIBTrunc->getOperand(0).getReg()); + AInfo Info(MF->getSubtarget()); + LegalizerHelper Helper(*MF, Info); + ASSERT_TRUE(Helper.widenScalar(*MIBUAddO, 0, s16) == + LegalizerHelper::LegalizeResult::Legalized); + + auto CheckStr = R"( + CHECK: [[Trunc:%[0-9]+]]:_(s8) = G_TRUNC + CHECK: [[LHS:%[0-9]+]]:_(s16) = G_ZEXT [[Trunc]] + CHECK: [[RHS:%[0-9]+]]:_(s16) = G_ZEXT [[Trunc]] + CHECK: [[ADD:%[0-9]+]]:_(s16) = G_ADD [[LHS]]:_, [[RHS]]:_ + CHECK: [[CST:%[0-9]+]]:_(s16) = G_CONSTANT i16 255 + CHECK: [[AND:%[0-9]+]]:_(s16) = G_AND [[ADD]]:_, [[CST]]:_ + CHECK: G_ICMP intpred(ne), [[ADD]]:_(s16), [[AND]]:_ + CHECK: G_TRUNC [[ADD]] + )"; + + // Check + ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr)); +} + +// USUBO widening. +TEST_F(LegalizerHelperTest, WidenUSUBO) { + if (!TM) + return; + + // Declare your legalization info + DefineLegalizerInfo(A, + { getActionDefinitionsBuilder(G_SUB).legalFor({s16}); }); + // Build + // Trunc it to s8. + LLT s8{LLT::scalar(8)}; + LLT s16{LLT::scalar(16)}; + auto MIBTrunc = B.buildTrunc(s8, Copies[0]); + unsigned CarryReg = MRI->createGenericVirtualRegister(LLT::scalar(1)); + auto MIBUSUBO = B.buildInstr(TargetOpcode::G_USUBO, s8) + .addDef(CarryReg) + .addUse(MIBTrunc->getOperand(0).getReg()) + .addUse(MIBTrunc->getOperand(0).getReg()); + AInfo Info(MF->getSubtarget()); + LegalizerHelper Helper(*MF, Info); + ASSERT_TRUE(Helper.widenScalar(*MIBUSUBO, 0, s16) == + LegalizerHelper::LegalizeResult::Legalized); + + auto CheckStr = R"( + CHECK: [[Trunc:%[0-9]+]]:_(s8) = G_TRUNC + CHECK: [[LHS:%[0-9]+]]:_(s16) = G_ZEXT [[Trunc]] + CHECK: [[RHS:%[0-9]+]]:_(s16) = G_ZEXT [[Trunc]] + CHECK: [[SUB:%[0-9]+]]:_(s16) = G_SUB [[LHS]]:_, [[RHS]]:_ + CHECK: [[CST:%[0-9]+]]:_(s16) = G_CONSTANT i16 255 + CHECK: [[AND:%[0-9]+]]:_(s16) = G_AND [[SUB]]:_, [[CST]]:_ + CHECK: G_ICMP intpred(ne), [[SUB]]:_(s16), [[AND]]:_ + CHECK: G_TRUNC [[SUB]] + )"; + + // Check + ASSERT_TRUE(CheckMachineFunction(*MF, CheckStr)); +} } // namespace |

