Skip to content

Commit

Permalink
[ProfileSummary] Make getProfileCount a non-static member function.
Browse files Browse the repository at this point in the history
This change is required because the notion of count is different for
sample profiling and getProfileCount will need to determine the
underlying profile type.

Differential revision: https://reviews.llvm.org/D33012

llvm-svn: 302597
  • Loading branch information
Easwaran Raman committed May 9, 2017
1 parent 77e9e84 commit f5f9160
Show file tree
Hide file tree
Showing 6 changed files with 21 additions and 16 deletions.
4 changes: 2 additions & 2 deletions llvm/include/llvm/Analysis/ProfileSummaryInfo.h
Expand Up @@ -67,8 +67,8 @@ class ProfileSummaryInfo {
}

/// Returns the profile count for \p CallInst.
static Optional<uint64_t> getProfileCount(const Instruction *CallInst,
BlockFrequencyInfo *BFI);
Optional<uint64_t> getProfileCount(const Instruction *CallInst,
BlockFrequencyInfo *BFI);
/// \brief Returns true if \p F has hot function entry.
bool isFunctionEntryHot(const Function *F);
/// Returns true if \p F has hot function entry or hot call edge.
Expand Down
7 changes: 5 additions & 2 deletions llvm/include/llvm/Transforms/Utils/Cloning.h
Expand Up @@ -43,6 +43,7 @@ class InvokeInst;
class Loop;
class LoopInfo;
class Module;
class ProfileSummaryInfo;
class ReturnInst;

/// Return an exact copy of the specified module
Expand Down Expand Up @@ -175,15 +176,17 @@ class InlineFunctionInfo {
explicit InlineFunctionInfo(CallGraph *cg = nullptr,
std::function<AssumptionCache &(Function &)>
*GetAssumptionCache = nullptr,
ProfileSummaryInfo *PSI = nullptr,
BlockFrequencyInfo *CallerBFI = nullptr,
BlockFrequencyInfo *CalleeBFI = nullptr)
: CG(cg), GetAssumptionCache(GetAssumptionCache), CallerBFI(CallerBFI),
CalleeBFI(CalleeBFI) {}
: CG(cg), GetAssumptionCache(GetAssumptionCache), PSI(PSI),
CallerBFI(CallerBFI), CalleeBFI(CalleeBFI) {}

/// CG - If non-null, InlineFunction will update the callgraph to reflect the
/// changes it makes.
CallGraph *CG;
std::function<AssumptionCache &(Function &)> *GetAssumptionCache;
ProfileSummaryInfo *PSI;
BlockFrequencyInfo *CallerBFI, *CalleeBFI;

/// StaticAllocas - InlineFunction fills this in with all static allocas that
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Analysis/ModuleSummaryAnalysis.cpp
Expand Up @@ -232,7 +232,7 @@ computeFunctionSummary(ModuleSummaryIndex &Index, const Module &M,
}
// We should have named any anonymous globals
assert(CalledFunction->hasName());
auto ScaledCount = ProfileSummaryInfo::getProfileCount(&I, BFI);
auto ScaledCount = PSI->getProfileCount(&I, BFI);
auto Hotness = ScaledCount ? getHotness(ScaledCount.getValue(), PSI)
: CalleeInfo::HotnessType::Unknown;

Expand Down
4 changes: 2 additions & 2 deletions llvm/lib/Transforms/IPO/Inliner.cpp
Expand Up @@ -502,7 +502,7 @@ inlineCallsImpl(CallGraphSCC &SCC, CallGraph &CG,
std::swap(CallSites[i--], CallSites[--FirstCallInSCC]);

InlinedArrayAllocasTy InlinedArrayAllocas;
InlineFunctionInfo InlineInfo(&CG, &GetAssumptionCache);
InlineFunctionInfo InlineInfo(&CG, &GetAssumptionCache, PSI);

// Now that we have all of the call sites, loop over them and inline them if
// it looks profitable to do so.
Expand Down Expand Up @@ -872,7 +872,7 @@ PreservedAnalyses InlinerPass::run(LazyCallGraph::SCC &InitialC,
// Setup the data structure used to plumb customization into the
// `InlineFunction` routine.
InlineFunctionInfo IFI(
/*cg=*/nullptr, &GetAssumptionCache,
/*cg=*/nullptr, &GetAssumptionCache, PSI,
&FAM.getResult<BlockFrequencyAnalysis>(*(CS.getCaller())),
&FAM.getResult<BlockFrequencyAnalysis>(Callee));

Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Transforms/IPO/PartialInlining.cpp
Expand Up @@ -473,7 +473,7 @@ Function *PartialInlinerImpl::unswitchFunction(Function *F) {
<< ore::NV("Callee", F) << " partially inlined into "
<< ore::NV("Caller", CS.getCaller()));

InlineFunctionInfo IFI(nullptr, GetAssumptionCache);
InlineFunctionInfo IFI(nullptr, GetAssumptionCache, PSI);
InlineFunction(CS, IFI);
NumPartialInlining++;
// update stats
Expand Down
18 changes: 10 additions & 8 deletions llvm/lib/Transforms/Utils/InlineFunction.cpp
Expand Up @@ -1396,11 +1396,12 @@ static void updateCallerBFI(BasicBlock *CallSiteBlock,
/// Update the branch metadata for cloned call instructions.
static void updateCallProfile(Function *Callee, const ValueToValueMapTy &VMap,
const Optional<uint64_t> &CalleeEntryCount,
const Instruction *TheCall) {
const Instruction *TheCall,
ProfileSummaryInfo *PSI) {
if (!CalleeEntryCount.hasValue() || CalleeEntryCount.getValue() < 1)
return;
Optional<uint64_t> CallSiteCount =
ProfileSummaryInfo::getProfileCount(TheCall, nullptr);
PSI ? PSI->getProfileCount(TheCall, nullptr) : None;
uint64_t CallCount =
std::min(CallSiteCount.hasValue() ? CallSiteCount.getValue() : 0,
CalleeEntryCount.getValue());
Expand All @@ -1423,16 +1424,16 @@ static void updateCallProfile(Function *Callee, const ValueToValueMapTy &VMap,
/// The callsite's block count is subtracted from the callee's function entry
/// count.
static void updateCalleeCount(BlockFrequencyInfo *CallerBFI, BasicBlock *CallBB,
Instruction *CallInst, Function *Callee) {
Instruction *CallInst, Function *Callee,
ProfileSummaryInfo *PSI) {
// If the callee has a original count of N, and the estimated count of
// callsite is M, the new callee count is set to N - M. M is estimated from
// the caller's entry count, its entry block frequency and the block frequency
// of the callsite.
Optional<uint64_t> CalleeCount = Callee->getEntryCount();
if (!CalleeCount.hasValue())
if (!CalleeCount.hasValue() || !PSI)
return;
Optional<uint64_t> CallCount =
ProfileSummaryInfo::getProfileCount(CallInst, CallerBFI);
Optional<uint64_t> CallCount = PSI->getProfileCount(CallInst, CallerBFI);
if (!CallCount.hasValue())
return;
// Since CallSiteCount is an estimate, it could exceed the original callee
Expand Down Expand Up @@ -1635,9 +1636,10 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI,
updateCallerBFI(OrigBB, VMap, IFI.CallerBFI, IFI.CalleeBFI,
CalledFunc->front());

updateCallProfile(CalledFunc, VMap, CalledFunc->getEntryCount(), TheCall);
updateCallProfile(CalledFunc, VMap, CalledFunc->getEntryCount(), TheCall,
IFI.PSI);
// Update the profile count of callee.
updateCalleeCount(IFI.CallerBFI, OrigBB, TheCall, CalledFunc);
updateCalleeCount(IFI.CallerBFI, OrigBB, TheCall, CalledFunc, IFI.PSI);

// Inject byval arguments initialization.
for (std::pair<Value*, Value*> &Init : ByValInit)
Expand Down

0 comments on commit f5f9160

Please sign in to comment.