summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/CodeGen/GlobalISel
diff options
context:
space:
mode:
authorVolkan Keles <vkeles@apple.com>2018-03-05 22:31:55 +0000
committerVolkan Keles <vkeles@apple.com>2018-03-05 22:31:55 +0000
commit2bc42e90ed147c45a1f0c74b61bb9f6176dbb9ef (patch)
tree11cda8054bf6a22e9ef55ff4aa0f428aa1cc2b5d /llvm/unittests/CodeGen/GlobalISel
parent82daad31fea78a9c75fcbbe79ce7070e642640d0 (diff)
downloadbcm5719-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.cpp29
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();
OpenPOWER on IntegriCloud