Skip to content

Commit

Permalink
Refactor the PSI to extract getCallSiteCount and remove checks for pr…
Browse files Browse the repository at this point in the history
…ofile 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

llvm-svn: 297500
  • Loading branch information
danielcdh committed Mar 10, 2017
1 parent ffdb00e commit c204815
Showing 3 changed files with 24 additions and 39 deletions.
4 changes: 3 additions & 1 deletion llvm/include/llvm/Analysis/ProfileSummaryInfo.h
Original file line number Diff line number Diff line change
@@ -49,12 +49,14 @@ class ProfileSummaryInfo {
void computeThresholds();
// Count thresholds to answer isHotCount and isColdCount queries.
Optional<uint64_t> 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<uint64_t> 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.
53 changes: 21 additions & 32 deletions llvm/lib/Analysis/ProfileSummaryInfo.cpp
Original file line number Diff line number Diff line change
@@ -68,6 +68,23 @@ bool ProfileSummaryInfo::computeSummary() {
return true;
}

Optional<uint64_t>
ProfileSummaryInfo::getProfileCount(const Instruction *Inst,
BlockFrequencyInfo *BFI) {
if (!Inst)
return None;
assert((isa<CallInst>(Inst) || isa<InvokeInst>(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<CallInst>(I) ||
(isa<TerminatorInst>(I) && !isa<ReturnInst>(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",
6 changes: 0 additions & 6 deletions llvm/unittests/Analysis/ProfileSummaryInfoTest.cpp
Original file line number Diff line number Diff line change
@@ -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) {

0 comments on commit c204815

Please sign in to comment.