diff options
author | Volkan Keles <vkeles@apple.com> | 2018-03-05 22:31:55 +0000 |
---|---|---|
committer | Volkan Keles <vkeles@apple.com> | 2018-03-05 22:31:55 +0000 |
commit | 2bc42e90ed147c45a1f0c74b61bb9f6176dbb9ef (patch) | |
tree | 11cda8054bf6a22e9ef55ff4aa0f428aa1cc2b5d /llvm/unittests/CodeGen/GlobalISel | |
parent | 82daad31fea78a9c75fcbbe79ce7070e642640d0 (diff) | |
download | bcm5719-llvm-2bc42e90ed147c45a1f0c74b61bb9f6176dbb9ef.tar.gz bcm5719-llvm-2bc42e90ed147c45a1f0c74b61bb9f6176dbb9ef.zip |
GlobalISel: IRTranslate llvm.fabs.* intrinsic
Summary:
Fabs is a common floating-point operation, especially for some expansions. This patch adds
a new generic opcode for llvm.fabs.* intrinsic in order to avoid building/matching this intrinsic.
Reviewers: qcolombet, aditya_nandakumar, dsanders, rovka
Reviewed By: aditya_nandakumar
Subscribers: kristof.beyls, javed.absar, llvm-commits
Differential Revision: https://reviews.llvm.org/D43864
llvm-svn: 326749
Diffstat (limited to 'llvm/unittests/CodeGen/GlobalISel')
-rw-r--r-- | llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp b/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp index aa185278f59..0816084c690 100644 --- a/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp +++ b/llvm/unittests/CodeGen/GlobalISel/PatternMatchTest.cpp @@ -230,6 +230,35 @@ TEST(PatternMatchInstr, MatchBinaryOp) { ASSERT_EQ(Src1, Copies[1]); } +TEST(PatternMatchInstr, MatchFPUnaryOp) { + LLVMContext Context; + std::unique_ptr<TargetMachine> TM = createTargetMachine(); + if (!TM) + return; + auto ModuleMMIPair = createDummyModule(Context, *TM, ""); + MachineFunction *MF = + getMFFromMMI(ModuleMMIPair.first.get(), ModuleMMIPair.second.get()); + SmallVector<unsigned, 4> Copies; + collectCopies(Copies, MF); + MachineBasicBlock *EntryMBB = &*MF->begin(); + MachineIRBuilder B(*MF); + MachineRegisterInfo &MRI = MF->getRegInfo(); + B.setInsertPt(*EntryMBB, EntryMBB->end()); + + // Truncate s64 to s32. + LLT s32 = LLT::scalar(32); + auto Copy0s32 = B.buildFPTrunc(s32, Copies[0]); + + // Match G_FABS. + auto MIBFabs = B.buildInstr(TargetOpcode::G_FABS, s32, Copy0s32); + bool match = mi_match(MIBFabs->getOperand(0).getReg(), MRI, m_GFabs(m_Reg())); + ASSERT_TRUE(match); + unsigned Src; + match = mi_match(MIBFabs->getOperand(0).getReg(), MRI, m_GFabs(m_Reg(Src))); + ASSERT_TRUE(match); + ASSERT_EQ(Src, Copy0s32->getOperand(0).getReg()); +} + TEST(PatternMatchInstr, MatchExtendsTrunc) { LLVMContext Context; std::unique_ptr<TargetMachine> TM = createTargetMachine(); |