6
6
//
7
7
// ===----------------------------------------------------------------------===//
8
8
9
+ #include " llvm/IR/Intrinsics.h"
10
+ #include " llvm/ADT/SmallVector.h"
11
+ #include " llvm/IR/Constant.h"
12
+ #include " llvm/IR/IRBuilder.h"
9
13
#include " llvm/IR/IntrinsicInst.h"
14
+ #include " llvm/IR/Module.h"
15
+ #include " llvm/Support/SourceMgr.h"
10
16
#include " gtest/gtest.h"
17
+ #include < algorithm>
18
+ #include < cstdarg>
11
19
12
20
using namespace llvm ;
13
21
14
22
namespace {
15
23
16
24
static const char *const NameTable1[] = {
17
- " llvm.foo" ,
18
- " llvm.foo.a" ,
19
- " llvm.foo.b" ,
20
- " llvm.foo.b.a" ,
21
- " llvm.foo.c" ,
25
+ " llvm.foo" , " llvm.foo.a" , " llvm.foo.b" , " llvm.foo.b.a" , " llvm.foo.c" ,
22
26
};
23
27
24
- TEST (IntrinNameLookup, Basic) {
28
+ class IntrinsicsTest : public ::testing::Test {
29
+ LLVMContext Context;
30
+ std::unique_ptr<Module> M;
31
+ BasicBlock *BB = nullptr ;
32
+
33
+ void TearDown () override { M.reset (); }
34
+
35
+ void SetUp () override {
36
+ M = std::make_unique<Module>(" Test" , Context);
37
+ auto F = M->getOrInsertFunction (
38
+ " test" , FunctionType::get (Type::getVoidTy (Context), false ));
39
+ BB = BasicBlock::Create (Context, " " , cast<Function>(F.getCallee ()));
40
+ EXPECT_NE (BB, nullptr );
41
+ }
42
+
43
+ public:
44
+ Instruction *makeIntrinsic (Intrinsic::ID ID) const {
45
+ IRBuilder<> Builder (BB);
46
+ SmallVector<Value*, 4 > ProcessedArgs;
47
+ auto *Decl = Intrinsic::getDeclaration (M.get (), ID);
48
+ for (auto *Ty : Decl->getFunctionType ()->params ()) {
49
+ auto *Val = Constant::getNullValue (Ty);
50
+ ProcessedArgs.push_back (Val);
51
+ }
52
+ return Builder.CreateCall (Decl, ProcessedArgs);
53
+ }
54
+ template <typename T> void checkIsa (const Instruction &I) {
55
+ EXPECT_TRUE (isa<T>(I));
56
+ }
57
+ };
58
+
59
+ TEST (IntrinsicNameLookup, Basic) {
25
60
int I = Intrinsic::lookupLLVMIntrinsicByName (NameTable1, " llvm.foo" );
26
61
EXPECT_EQ (0 , I);
27
62
I = Intrinsic::lookupLLVMIntrinsicByName (NameTable1, " llvm.foo.f64" );
@@ -36,4 +71,45 @@ TEST(IntrinNameLookup, Basic) {
36
71
EXPECT_EQ (4 , I);
37
72
}
38
73
74
+ TEST_F (IntrinsicsTest, InstrProfInheritance) {
75
+ auto isInstrProfInstBase = [](const Instruction &I) {
76
+ return isa<InstrProfInstBase>(I);
77
+ };
78
+ #define __ISA (TYPE, PARENT ) \
79
+ auto is##TYPE = [&](const Instruction &I) -> bool { \
80
+ return isa<TYPE>(I) && is##PARENT (I); \
81
+ }
82
+ __ISA (InstrProfCntrInstBase, InstrProfInstBase);
83
+ __ISA (InstrProfMCDCCondBitmapUpdate, InstrProfInstBase);
84
+ __ISA (InstrProfCoverInst, InstrProfCntrInstBase);
85
+ __ISA (InstrProfIncrementInst, InstrProfCntrInstBase);
86
+ __ISA (InstrProfIncrementInstStep, InstrProfIncrementInst);
87
+ __ISA (InstrProfTimestampInst, InstrProfCntrInstBase);
88
+ __ISA (InstrProfValueProfileInst, InstrProfCntrInstBase);
89
+ __ISA (InstrProfMCDCBitmapInstBase, InstrProfInstBase);
90
+ __ISA (InstrProfMCDCBitmapParameters, InstrProfMCDCBitmapInstBase);
91
+ __ISA (InstrProfMCDCTVBitmapUpdate, InstrProfMCDCBitmapInstBase);
92
+ #undef __ISA
93
+
94
+ std::vector<
95
+ std::pair<Intrinsic::ID, std::function<bool (const Instruction &)>>>
96
+ LeafIDs = {
97
+ {Intrinsic::instrprof_cover, isInstrProfCoverInst},
98
+ {Intrinsic::instrprof_increment, isInstrProfIncrementInst},
99
+ {Intrinsic::instrprof_increment_step, isInstrProfIncrementInstStep},
100
+ {Intrinsic::instrprof_mcdc_condbitmap_update,
101
+ isInstrProfMCDCCondBitmapUpdate},
102
+ {Intrinsic::instrprof_mcdc_parameters,
103
+ isInstrProfMCDCBitmapParameters},
104
+ {Intrinsic::instrprof_mcdc_tvbitmap_update,
105
+ isInstrProfMCDCTVBitmapUpdate},
106
+ {Intrinsic::instrprof_timestamp, isInstrProfTimestampInst},
107
+ {Intrinsic::instrprof_value_profile, isInstrProfValueProfileInst}};
108
+ for (const auto &[ID, Checker] : LeafIDs) {
109
+ auto *Intr = makeIntrinsic (ID);
110
+ EXPECT_TRUE (Checker (*Intr));
111
+ }
112
+
113
+ #undef RULES
114
+ }
39
115
} // end namespace
0 commit comments