From dadc0f11ad99841f6b205bf798497ee32adf7ec6 Mon Sep 17 00:00:00 2001 From: Easwaran Raman Date: Tue, 16 May 2017 20:14:39 +0000 Subject: [PATCH] Add hasProfileSummary and has{Sample|Instrumentation}Profile methods ProfileSummaryInfo already checks whether the module has sample profile in determining profile counts. This will also be useful in inliner to clean up threshold updates. llvm-svn: 303204 --- llvm/include/llvm/Analysis/ProfileSummaryInfo.h | 15 +++++++++++++++ llvm/lib/Analysis/ProfileSummaryInfo.cpp | 2 +- llvm/unittests/Analysis/ProfileSummaryInfoTest.cpp | 8 ++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/llvm/include/llvm/Analysis/ProfileSummaryInfo.h b/llvm/include/llvm/Analysis/ProfileSummaryInfo.h index c5f9708..6aaabe1 100644 --- a/llvm/include/llvm/Analysis/ProfileSummaryInfo.h +++ b/llvm/include/llvm/Analysis/ProfileSummaryInfo.h @@ -55,6 +55,21 @@ public: ProfileSummaryInfo(ProfileSummaryInfo &&Arg) : M(Arg.M), Summary(std::move(Arg.Summary)) {} + /// \brief Returns true if profile summary is available. + bool hasProfileSummary() { return computeSummary(); } + + /// \brief Returns true if module \c M has sample profile. + bool hasSampleProfile() { + return hasProfileSummary() && + Summary->getKind() == ProfileSummary::PSK_Sample; + } + + /// \brief Returns true if module \c M has instrumentation profile. + bool hasInstrumentationProfile() { + return hasProfileSummary() && + Summary->getKind() == ProfileSummary::PSK_Instr; + } + /// Handle the invalidation of this information. /// /// When used as a result of \c ProfileSummaryAnalysis this method will be diff --git a/llvm/lib/Analysis/ProfileSummaryInfo.cpp b/llvm/lib/Analysis/ProfileSummaryInfo.cpp index 502f420..12b86da 100644 --- a/llvm/lib/Analysis/ProfileSummaryInfo.cpp +++ b/llvm/lib/Analysis/ProfileSummaryInfo.cpp @@ -75,7 +75,7 @@ ProfileSummaryInfo::getProfileCount(const Instruction *Inst, return None; assert((isa(Inst) || isa(Inst)) && "We can only get profile count for call/invoke instruction."); - if (computeSummary() && Summary->getKind() == ProfileSummary::PSK_Sample) { + if (hasSampleProfile()) { // In sample PGO mode, check if there is a profile metadata on the // instruction. If it is present, determine hotness solely based on that, // since the sampled entry count may not be accurate. diff --git a/llvm/unittests/Analysis/ProfileSummaryInfoTest.cpp b/llvm/unittests/Analysis/ProfileSummaryInfoTest.cpp index 3454474..c9e4fc0 100644 --- a/llvm/unittests/Analysis/ProfileSummaryInfoTest.cpp +++ b/llvm/unittests/Analysis/ProfileSummaryInfoTest.cpp @@ -102,6 +102,9 @@ TEST_F(ProfileSummaryInfoTest, TestNoProfile) { Function *F = M->getFunction("f"); ProfileSummaryInfo PSI = buildPSI(M.get()); + EXPECT_FALSE(PSI.hasProfileSummary()); + EXPECT_FALSE(PSI.hasSampleProfile()); + EXPECT_FALSE(PSI.hasInstrumentationProfile()); // In the absence of profiles, is{Hot|Cold}X methods should always return // false. EXPECT_FALSE(PSI.isHotCount(1000)); @@ -130,6 +133,7 @@ TEST_F(ProfileSummaryInfoTest, TestCommon) { Function *H = M->getFunction("h"); ProfileSummaryInfo PSI = buildPSI(M.get()); + EXPECT_TRUE(PSI.hasProfileSummary()); EXPECT_TRUE(PSI.isHotCount(400)); EXPECT_TRUE(PSI.isColdCount(2)); EXPECT_FALSE(PSI.isColdCount(100)); @@ -144,6 +148,8 @@ TEST_F(ProfileSummaryInfoTest, InstrProf) { auto M = makeLLVMModule("InstrProf"); Function *F = M->getFunction("f"); ProfileSummaryInfo PSI = buildPSI(M.get()); + EXPECT_TRUE(PSI.hasProfileSummary()); + EXPECT_TRUE(PSI.hasInstrumentationProfile()); BasicBlock &BB0 = F->getEntryBlock(); BasicBlock *BB1 = BB0.getTerminator()->getSuccessor(0); @@ -174,6 +180,8 @@ TEST_F(ProfileSummaryInfoTest, SampleProf) { auto M = makeLLVMModule("SampleProfile"); Function *F = M->getFunction("f"); ProfileSummaryInfo PSI = buildPSI(M.get()); + EXPECT_TRUE(PSI.hasProfileSummary()); + EXPECT_TRUE(PSI.hasSampleProfile()); BasicBlock &BB0 = F->getEntryBlock(); BasicBlock *BB1 = BB0.getTerminator()->getSuccessor(0); -- 2.7.4