Skip to content

Commit 59c16b5

Browse files
committed
[PGO] Test for inheritance relationships for instrprof intrinsics
Following up PR llvm#83511, added a test to cover the inheritance graph for these intrinsics.
1 parent c045955 commit 59c16b5

File tree

1 file changed

+82
-6
lines changed

1 file changed

+82
-6
lines changed

llvm/unittests/IR/IntrinsicsTest.cpp

Lines changed: 82 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,57 @@
66
//
77
//===----------------------------------------------------------------------===//
88

9+
#include "llvm/IR/Intrinsics.h"
10+
#include "llvm/ADT/SmallVector.h"
11+
#include "llvm/IR/Constant.h"
12+
#include "llvm/IR/IRBuilder.h"
913
#include "llvm/IR/IntrinsicInst.h"
14+
#include "llvm/IR/Module.h"
15+
#include "llvm/Support/SourceMgr.h"
1016
#include "gtest/gtest.h"
17+
#include <algorithm>
18+
#include <cstdarg>
1119

1220
using namespace llvm;
1321

1422
namespace {
1523

1624
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",
2226
};
2327

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) {
2560
int I = Intrinsic::lookupLLVMIntrinsicByName(NameTable1, "llvm.foo");
2661
EXPECT_EQ(0, I);
2762
I = Intrinsic::lookupLLVMIntrinsicByName(NameTable1, "llvm.foo.f64");
@@ -36,4 +71,45 @@ TEST(IntrinNameLookup, Basic) {
3671
EXPECT_EQ(4, I);
3772
}
3873

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+
}
39115
} // end namespace

0 commit comments

Comments
 (0)