forked from OSchip/llvm-project
We can improve the performance (generally) by memo-izing the action to map a debug location to its function summary.
Summary: Here are timings (as reported by "opt -time-passes") for sample-profile pass for some files holding hot functions from a major service©r. Average 17% reduction. Delta column is 100*(old-new)/old. ``` Old New Delta 0.0537 0.0538 -0.2% 0.8155 0.6522 20.0% 0.0779 0.0751 3.6% 0.0727 0.0913 -25.6% 0.1622 0.1302 19.7% 0.0627 0.0594 5.3% 0.0766 0.0744 2.9% 0.6426 0.4387 31.7% 0.3521 0.2776 21.2% 0.3549 0.2721 23.3% 0.0912 0.0904 0.9% 0.1236 0.1059 14.3% 0.0854 0.0866 -1.4% 0.0757 0.0722 4.6% 0.1293 0.1147 11.3% 0.1354 0.1122 17.1% 0.0767 0.0770 -0.4% 0.1135 0.0968 14.7% 0.0524 0.0608 -16.0% 0.1279 0.1106 13.5% ========== 3.6820 3.0520 17.1% Total ``` Reviewers: twoh, Kader, danielcdh, wmi Reviewed By: wmi Subscribers: dblaikie, llvm-commits Differential Revision: https://reviews.llvm.org/D56435 llvm-svn: 351211
This commit is contained in:
parent
9c53890833
commit
dee001207e
|
@ -218,6 +218,7 @@ protected:
|
||||||
const FunctionSamples *findCalleeFunctionSamples(const Instruction &I) const;
|
const FunctionSamples *findCalleeFunctionSamples(const Instruction &I) const;
|
||||||
std::vector<const FunctionSamples *>
|
std::vector<const FunctionSamples *>
|
||||||
findIndirectCallFunctionSamples(const Instruction &I, uint64_t &Sum) const;
|
findIndirectCallFunctionSamples(const Instruction &I, uint64_t &Sum) const;
|
||||||
|
mutable DenseMap<const DILocation *, const FunctionSamples *> DILocation2SampleMap;
|
||||||
const FunctionSamples *findFunctionSamples(const Instruction &I) const;
|
const FunctionSamples *findFunctionSamples(const Instruction &I) const;
|
||||||
bool inlineCallInstruction(Instruction *I);
|
bool inlineCallInstruction(Instruction *I);
|
||||||
bool inlineHotFunctions(Function &F,
|
bool inlineHotFunctions(Function &F,
|
||||||
|
@ -719,12 +720,14 @@ SampleProfileLoader::findIndirectCallFunctionSamples(
|
||||||
/// \returns the FunctionSamples pointer to the inlined instance.
|
/// \returns the FunctionSamples pointer to the inlined instance.
|
||||||
const FunctionSamples *
|
const FunctionSamples *
|
||||||
SampleProfileLoader::findFunctionSamples(const Instruction &Inst) const {
|
SampleProfileLoader::findFunctionSamples(const Instruction &Inst) const {
|
||||||
SmallVector<std::pair<LineLocation, StringRef>, 10> S;
|
|
||||||
const DILocation *DIL = Inst.getDebugLoc();
|
const DILocation *DIL = Inst.getDebugLoc();
|
||||||
if (!DIL)
|
if (!DIL)
|
||||||
return Samples;
|
return Samples;
|
||||||
|
|
||||||
return Samples->findFunctionSamples(DIL);
|
auto it = DILocation2SampleMap.try_emplace(DIL,nullptr);
|
||||||
|
if (it.second)
|
||||||
|
it.first->second = Samples->findFunctionSamples(DIL);
|
||||||
|
return it.first->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SampleProfileLoader::inlineCallInstruction(Instruction *I) {
|
bool SampleProfileLoader::inlineCallInstruction(Instruction *I) {
|
||||||
|
@ -1610,6 +1613,8 @@ bool SampleProfileLoaderLegacyPass::runOnModule(Module &M) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SampleProfileLoader::runOnFunction(Function &F, ModuleAnalysisManager *AM) {
|
bool SampleProfileLoader::runOnFunction(Function &F, ModuleAnalysisManager *AM) {
|
||||||
|
|
||||||
|
DILocation2SampleMap.clear();
|
||||||
// By default the entry count is initialized to -1, which will be treated
|
// By default the entry count is initialized to -1, which will be treated
|
||||||
// conservatively by getEntryCount as the same as unknown (None). This is
|
// conservatively by getEntryCount as the same as unknown (None). This is
|
||||||
// to avoid newly added code to be treated as cold. If we have samples
|
// to avoid newly added code to be treated as cold. If we have samples
|
||||||
|
|
Loading…
Reference in New Issue