@@ -35,13 +35,15 @@ struct PatternMatchTest : ::testing::Test {
35
35
Function *F;
36
36
BasicBlock *BB;
37
37
IRBuilder<NoFolder> IRB;
38
+ TargetLibraryInfoImpl TLII;
39
+ TargetLibraryInfo TLI;
38
40
39
41
PatternMatchTest ()
40
42
: M(new Module(" PatternMatchTestModule" , Ctx)),
41
43
F (Function::Create(
42
44
FunctionType::get (Type::getVoidTy(Ctx), /* IsVarArg */ false),
43
45
Function::ExternalLinkage, "f", M.get())),
44
- BB(BasicBlock::Create(Ctx, " entry" , F)), IRB(BB) {}
46
+ BB(BasicBlock::Create(Ctx, " entry" , F)), IRB(BB), TLI(TLII) {}
45
47
};
46
48
47
49
TEST_F (PatternMatchTest, OneUse) {
@@ -1008,6 +1010,40 @@ TEST_F(PatternMatchTest, FloatingPointFNeg) {
1008
1010
EXPECT_FALSE (match (V3, m_FNeg (m_Value (Match))));
1009
1011
}
1010
1012
1013
+ TEST_F (PatternMatchTest, LibFunc) {
1014
+ Type *FltTy = IRB.getFloatTy ();
1015
+ Value *One = ConstantFP::get (FltTy, 1.0 );
1016
+ Value *Two = ConstantFP::get (FltTy, 2.0 );
1017
+ Value *MatchOne, *MatchTwo;
1018
+
1019
+ StringRef TanName = TLI.getName (LibFunc_tan);
1020
+ FunctionCallee TanCallee = M->getOrInsertFunction (TanName, FltTy, FltTy);
1021
+ CallInst *Tan = IRB.CreateCall (TanCallee, One, TanName);
1022
+
1023
+ StringRef PowName = TLI.getName (LibFunc_pow);
1024
+ FunctionCallee PowCallee = M->getOrInsertFunction (PowName, FltTy, FltTy, FltTy);
1025
+ CallInst *Pow = IRB.CreateCall (PowCallee, {One, Two}, PowName);
1026
+
1027
+ EXPECT_TRUE (match (Tan, m_LibFunc<LibFunc_tan>(TLI)));
1028
+ EXPECT_FALSE (match (Tan, m_LibFunc<LibFunc_pow>(TLI)));
1029
+ EXPECT_FALSE (match (Pow, m_LibFunc<LibFunc_tan>(TLI)));
1030
+
1031
+ EXPECT_TRUE (match (Tan, m_LibFunc<LibFunc_tan>(TLI, m_Value (MatchOne))));
1032
+ EXPECT_EQ (One, MatchOne);
1033
+ EXPECT_FALSE (match (Tan, m_LibFunc<LibFunc_sin>(TLI, m_Value ())));
1034
+
1035
+ EXPECT_TRUE (match (Pow, m_LibFunc<LibFunc_pow>(TLI, m_Value (MatchOne),
1036
+ m_Value (MatchTwo))));
1037
+ EXPECT_EQ (One, MatchOne);
1038
+ EXPECT_EQ (Two, MatchTwo);
1039
+ EXPECT_FALSE (match (Pow, m_LibFunc<LibFunc_fminf>(TLI, m_Value (), m_Value ())));
1040
+
1041
+ TLII.disableAllFunctions ();
1042
+ EXPECT_FALSE (match (Tan, m_LibFunc<LibFunc_tan>(TLI)));
1043
+ EXPECT_FALSE (match (Tan, m_LibFunc<LibFunc_tan>(TLI, m_Value ())));
1044
+ EXPECT_FALSE (match (Pow, m_LibFunc<LibFunc_pow>(TLI, m_Value (), m_Value ())));
1045
+ }
1046
+
1011
1047
template <typename T> struct MutableConstTest : PatternMatchTest { };
1012
1048
1013
1049
typedef ::testing::Types<std::tuple<Value*, Instruction*>,
0 commit comments