From: Dehao Chen Date: Fri, 10 Mar 2017 19:45:16 +0000 (+0000) Subject: Refactor the PSI to extract getCallSiteCount and remove checks for profile type. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a328a4627d385650df9b96b364f700ee48bedf6c;p=llvm Refactor the PSI to extract getCallSiteCount and remove checks for profile type. Summary: There is no need to check profile count as only CallInst will have metadata attached. Reviewers: eraman Reviewed By: eraman Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D30799 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@297500 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Analysis/ProfileSummaryInfo.h b/include/llvm/Analysis/ProfileSummaryInfo.h index 80f57fde6fa..0d8db4b351c 100644 --- a/include/llvm/Analysis/ProfileSummaryInfo.h +++ b/include/llvm/Analysis/ProfileSummaryInfo.h @@ -49,12 +49,14 @@ private: void computeThresholds(); // Count thresholds to answer isHotCount and isColdCount queries. Optional HotCountThreshold, ColdCountThreshold; - bool extractProfTotalWeight(const Instruction *TI, uint64_t &TotalCount); public: ProfileSummaryInfo(Module &M) : M(M) {} ProfileSummaryInfo(ProfileSummaryInfo &&Arg) : M(Arg.M), Summary(std::move(Arg.Summary)) {} + /// Returns the profile count for \p CallInst. + static Optional getProfileCount(const Instruction *CallInst, + BlockFrequencyInfo *BFI); /// \brief Returns true if \p F has hot function entry. bool isFunctionEntryHot(const Function *F); /// \brief Returns true if \p F has cold function entry. diff --git a/lib/Analysis/ProfileSummaryInfo.cpp b/lib/Analysis/ProfileSummaryInfo.cpp index 623c9fac52a..8f3092347b5 100644 --- a/lib/Analysis/ProfileSummaryInfo.cpp +++ b/lib/Analysis/ProfileSummaryInfo.cpp @@ -68,6 +68,23 @@ bool ProfileSummaryInfo::computeSummary() { return true; } +Optional +ProfileSummaryInfo::getProfileCount(const Instruction *Inst, + BlockFrequencyInfo *BFI) { + if (!Inst) + return None; + assert((isa(Inst) || isa(Inst)) && + "We can only get profile count for call/invoke instruction."); + // Check if there is a profile metadata on the instruction. If it is present, + // determine hotness solely based on that. + uint64_t TotalCount; + if (Inst->extractProfTotalWeight(TotalCount)) + return TotalCount; + if (BFI) + return BFI->getBlockProfileCount(Inst->getParent()); + return None; +} + /// Returns true if the function's entry is hot. If it returns false, it /// either means it is not hot or it is unknown whether it is hot or not (for /// example, no profile data is available). @@ -133,44 +150,16 @@ bool ProfileSummaryInfo::isColdBB(const BasicBlock *B, return Count && isColdCount(*Count); } -bool ProfileSummaryInfo::extractProfTotalWeight(const Instruction *I, - uint64_t &TotalCount) { - if (!computeSummary()) - return false; - // Use profile weight on metadata only for sample profiling where block counts - // could differ from the count of an instruction within the block. - if (Summary.get()->getKind() != ProfileSummary::PSK_Sample) - return false; - - return (isa(I) || - (isa(I) && !isa(I))) && - I->extractProfTotalWeight(TotalCount); -} - bool ProfileSummaryInfo::isHotCallSite(const CallSite &CS, BlockFrequencyInfo *BFI) { - auto *CallInst = CS.getInstruction(); - if (!CS) - return false; - // Check if there is a profile metadata on the instruction. If it is present, - // determine hotness solely based on that. - uint64_t TotalCount; - if (extractProfTotalWeight(CallInst, TotalCount)) - return isHotCount(TotalCount); - return BFI && isHotBB(CallInst->getParent(), BFI); + auto C = getProfileCount(CS.getInstruction(), BFI); + return C && isHotCount(*C); } bool ProfileSummaryInfo::isColdCallSite(const CallSite &CS, BlockFrequencyInfo *BFI) { - auto *CallInst = CS.getInstruction(); - if (!CS) - return false; - // Check if there is a profile metadata on the instruction. If it is present, - // and tells that the callsite is not cold, then return false; - uint64_t TotalCount; - if (extractProfTotalWeight(CallInst, TotalCount) && !isColdCount(TotalCount)) - return false; - return BFI && isColdBB(CallInst->getParent(), BFI); + auto C = getProfileCount(CS.getInstruction(), BFI); + return C && isColdCount(*C); } INITIALIZE_PASS(ProfileSummaryInfoWrapperPass, "profile-summary-info", diff --git a/unittests/Analysis/ProfileSummaryInfoTest.cpp b/unittests/Analysis/ProfileSummaryInfoTest.cpp index 56a8c2ec14d..0b4b1de2805 100644 --- a/unittests/Analysis/ProfileSummaryInfoTest.cpp +++ b/unittests/Analysis/ProfileSummaryInfoTest.cpp @@ -162,12 +162,6 @@ TEST_F(ProfileSummaryInfoTest, InstrProf) { EXPECT_TRUE(PSI.isHotCallSite(CS1, &BFI)); EXPECT_FALSE(PSI.isHotCallSite(CS2, &BFI)); - - // Test that adding an MD_prof metadata with a hot count on CS2 does not - // change itas hotness as it has no effect in instrumented profiling. - MDBuilder MDB(M->getContext()); - CI2->setMetadata(llvm::LLVMContext::MD_prof, MDB.createBranchWeights({400})); - EXPECT_FALSE(PSI.isHotCallSite(CS2, &BFI)); } TEST_F(ProfileSummaryInfoTest, SampleProf) {