mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
[ProfileSummary] Make getProfileCount a non-static member function.
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
This commit is contained in:
parent
948f554dba
commit
27264ebea8
@ -67,8 +67,8 @@ public:
|
||||
}
|
||||
|
||||
/// 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.
|
||||
|
@ -43,6 +43,7 @@ class InvokeInst;
|
||||
class Loop;
|
||||
class LoopInfo;
|
||||
class Module;
|
||||
class ProfileSummaryInfo;
|
||||
class ReturnInst;
|
||||
|
||||
/// Return an exact copy of the specified module
|
||||
@ -175,15 +176,17 @@ public:
|
||||
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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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.
|
||||
@ -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));
|
||||
|
||||
|
@ -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
|
||||
|
@ -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());
|
||||
@ -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
|
||||
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user