summaryrefslogtreecommitdiffstats
path: root/llvm/unittests/IR/PatternMatch.cpp
diff options
context:
space:
mode:
authorDmitry Venikov <quolyk@gmail.com>2019-07-15 14:47:45 +0000
committerDmitry Venikov <quolyk@gmail.com>2019-07-15 14:47:45 +0000
commitcb238de456ba2db699d969858eddbc0971c8592c (patch)
treedd02202e3b68a1a901ec9fd7af67e03a3b4c35e4 /llvm/unittests/IR/PatternMatch.cpp
parent63d00b19e5c4c92396c8221a10a4c67e2ba09f91 (diff)
downloadbcm5719-llvm-cb238de456ba2db699d969858eddbc0971c8592c.tar.gz
bcm5719-llvm-cb238de456ba2db699d969858eddbc0971c8592c.zip
[PatternMatch] Implement matching code for LibFunc
Summary: Provides m_LibFunc pattern that can be used to match LibFuncs. Reviewers: spatel, hfinkel, efriedma, lebedev.ri Reviewed By: lebedev.ri Subscribers: lebedev.ri, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D42047 llvm-svn: 366069
Diffstat (limited to 'llvm/unittests/IR/PatternMatch.cpp')
-rw-r--r--llvm/unittests/IR/PatternMatch.cpp38
1 files changed, 37 insertions, 1 deletions
diff --git a/llvm/unittests/IR/PatternMatch.cpp b/llvm/unittests/IR/PatternMatch.cpp
index 600494fba26..3f8e6918019 100644
--- a/llvm/unittests/IR/PatternMatch.cpp
+++ b/llvm/unittests/IR/PatternMatch.cpp
@@ -35,13 +35,15 @@ struct PatternMatchTest : ::testing::Test {
Function *F;
BasicBlock *BB;
IRBuilder<NoFolder> IRB;
+ TargetLibraryInfoImpl TLII;
+ TargetLibraryInfo TLI;
PatternMatchTest()
: M(new Module("PatternMatchTestModule", Ctx)),
F(Function::Create(
FunctionType::get(Type::getVoidTy(Ctx), /* IsVarArg */ false),
Function::ExternalLinkage, "f", M.get())),
- BB(BasicBlock::Create(Ctx, "entry", F)), IRB(BB) {}
+ BB(BasicBlock::Create(Ctx, "entry", F)), IRB(BB), TLI(TLII) {}
};
TEST_F(PatternMatchTest, OneUse) {
@@ -1008,6 +1010,40 @@ TEST_F(PatternMatchTest, FloatingPointFNeg) {
EXPECT_FALSE(match(V3, m_FNeg(m_Value(Match))));
}
+TEST_F(PatternMatchTest, LibFunc) {
+ Type *FltTy = IRB.getFloatTy();
+ Value *One = ConstantFP::get(FltTy, 1.0);
+ Value *Two = ConstantFP::get(FltTy, 2.0);
+ Value *MatchOne, *MatchTwo;
+
+ StringRef TanName = TLI.getName(LibFunc_tan);
+ FunctionCallee TanCallee = M->getOrInsertFunction(TanName, FltTy, FltTy);
+ CallInst *Tan = IRB.CreateCall(TanCallee, One, TanName);
+
+ StringRef PowName = TLI.getName(LibFunc_pow);
+ FunctionCallee PowCallee = M->getOrInsertFunction(PowName, FltTy, FltTy, FltTy);
+ CallInst *Pow = IRB.CreateCall(PowCallee, {One, Two}, PowName);
+
+ EXPECT_TRUE(match(Tan, m_LibFunc<LibFunc_tan>(TLI)));
+ EXPECT_FALSE(match(Tan, m_LibFunc<LibFunc_pow>(TLI)));
+ EXPECT_FALSE(match(Pow, m_LibFunc<LibFunc_tan>(TLI)));
+
+ EXPECT_TRUE(match(Tan, m_LibFunc<LibFunc_tan>(TLI, m_Value(MatchOne))));
+ EXPECT_EQ(One, MatchOne);
+ EXPECT_FALSE(match(Tan, m_LibFunc<LibFunc_sin>(TLI, m_Value())));
+
+ EXPECT_TRUE(match(Pow, m_LibFunc<LibFunc_pow>(TLI, m_Value(MatchOne),
+ m_Value(MatchTwo))));
+ EXPECT_EQ(One, MatchOne);
+ EXPECT_EQ(Two, MatchTwo);
+ EXPECT_FALSE(match(Pow, m_LibFunc<LibFunc_fminf>(TLI, m_Value(), m_Value())));
+
+ TLII.disableAllFunctions();
+ EXPECT_FALSE(match(Tan, m_LibFunc<LibFunc_tan>(TLI)));
+ EXPECT_FALSE(match(Tan, m_LibFunc<LibFunc_tan>(TLI, m_Value())));
+ EXPECT_FALSE(match(Pow, m_LibFunc<LibFunc_pow>(TLI, m_Value(), m_Value())));
+}
+
template <typename T> struct MutableConstTest : PatternMatchTest { };
typedef ::testing::Types<std::tuple<Value*, Instruction*>,
OpenPOWER on IntegriCloud