[llvm] [ctx_prof] Add analysis utility to fetch ID of a callsite (PR #104491)
Snehasish Kumar via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 20 09:37:24 PDT 2024
================
@@ -0,0 +1,136 @@
+//===--- CtxProfAnalysisTest.cpp ------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Analysis/CtxProfAnalysis.h"
+#include "llvm/Analysis/BlockFrequencyInfo.h"
+#include "llvm/Analysis/BranchProbabilityInfo.h"
+#include "llvm/Analysis/CGSCCPassManager.h"
+#include "llvm/Analysis/LoopAnalysisManager.h"
+#include "llvm/AsmParser/Parser.h"
+#include "llvm/IR/Analysis.h"
+#include "llvm/IR/Module.h"
+#include "llvm/IR/PassInstrumentation.h"
+#include "llvm/IR/PassManager.h"
+#include "llvm/Passes/PassBuilder.h"
+#include "llvm/Support/SourceMgr.h"
+#include "llvm/Transforms/Instrumentation/PGOInstrumentation.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+using namespace llvm;
+
+namespace {
+
+class CtxProfAnalysisTest : public testing::Test {
+ static constexpr auto *IR = R"IR(
+declare void @bar()
+
+define private void @foo(i32 %a, ptr %fct) #0 !guid !0 {
+ %t = icmp eq i32 %a, 0
+ br i1 %t, label %yes, label %no
+yes:
+ call void %fct(i32 %a)
+ br label %exit
+no:
+ call void @bar()
+ br label %exit
+exit:
+ ret void
+}
+
+define void @an_entrypoint(i32 %a) {
+ %t = icmp eq i32 %a, 0
+ br i1 %t, label %yes, label %no
+
+yes:
+ call void @foo(i32 1, ptr null)
+ ret void
+no:
+ ret void
+}
+
+define void @another_entrypoint_no_callees(i32 %a) {
+ %t = icmp eq i32 %a, 0
+ br i1 %t, label %yes, label %no
+
+yes:
+ ret void
+no:
+ ret void
+}
+
+attributes #0 = { noinline }
+!0 = !{ i64 11872291593386833696 }
+)IR";
+
+protected:
+ LLVMContext C;
+ PassBuilder PB;
+ ModuleAnalysisManager MAM;
+ FunctionAnalysisManager FAM;
+ CGSCCAnalysisManager CGAM;
+ LoopAnalysisManager LAM;
+ std::unique_ptr<Module> M;
+
+ void SetUp() override {
+ SMDiagnostic Err;
+ M = parseAssemblyString(IR, Err, C);
+ ASSERT_TRUE(!!M);
+ }
+
+public:
+ CtxProfAnalysisTest() {
+ PB.registerModuleAnalyses(MAM);
+ PB.registerCGSCCAnalyses(CGAM);
+ PB.registerFunctionAnalyses(FAM);
+ PB.registerLoopAnalyses(LAM);
+ PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
+ }
+};
+
+TEST_F(CtxProfAnalysisTest, GetCallsiteIDTest) {
+ ModulePassManager MPM;
+ MPM.addPass(PGOInstrumentationGen(PGOInstrumentationType::CTXPROF));
+ EXPECT_FALSE(MPM.run(*M, MAM).areAllPreserved());
+ auto *F = M->getFunction("foo");
+ ASSERT_NE(F, nullptr);
+ std::vector<uint32_t> InsValues;
+
+ for (auto &BB : *F)
+ for (auto &I : BB)
+ if (auto *CB = dyn_cast<CallBase>(&I)) {
+ // Skip instrumentation inserted intrinsics.
+ if (!CB ||
+ (CB->getCalledFunction() && CB->getCalledFunction()->isIntrinsic()))
+ continue;
+ auto *Ins = CtxProfAnalysis::getCallsiteInstrumentation(*CB);
+ ASSERT_NE(Ins, nullptr);
+ InsValues.push_back(Ins->getIndex()->getZExtValue());
+ }
+
+ EXPECT_THAT(InsValues, testing::ElementsAre(0, 1));
+}
+
+TEST_F(CtxProfAnalysisTest, GetCallsiteIDNegativeTest) {
+ auto *F = M->getFunction("foo");
+ ASSERT_NE(F, nullptr);
+ CallBase *FirstCall = nullptr;
+ for (auto &BB : *F)
+ for (auto &I : BB)
+ if (auto *CB = dyn_cast<CallBase>(&I)) {
+ if (CB->isIndirectCall() || !CB->getCalledFunction()->isIntrinsic()) {
+ FirstCall = CB;
+ break;
+ }
+ }
+ ASSERT_NE(FirstCall, nullptr);
+ auto *IndIns = CtxProfAnalysis::getCallsiteInstrumentation(*FirstCall);
+ ASSERT_EQ(IndIns, nullptr);
----------------
snehasish wrote:
EXPECT_EQ?
https://github.com/llvm/llvm-project/pull/104491
More information about the llvm-commits
mailing list