diff options
author | David Callahan <dcallahan@fb.com> | 2019-01-15 17:45:54 +0000 |
---|---|---|
committer | David Callahan <dcallahan@fb.com> | 2019-01-15 17:45:54 +0000 |
commit | f8de08422f2c02b9adcad6401ba0d25a8d52fab9 (patch) | |
tree | 94ecbe5db0d85d5d73c4cb0857375114a761726a /llvm | |
parent | b5a0fbd55d25df4785839244346d65031b550f90 (diff) |
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
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Transforms/IPO/SampleProfile.cpp | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/IPO/SampleProfile.cpp b/llvm/lib/Transforms/IPO/SampleProfile.cpp index 1e86e04a79d..9f123c2b875 100644 --- a/llvm/lib/Transforms/IPO/SampleProfile.cpp +++ b/llvm/lib/Transforms/IPO/SampleProfile.cpp @@ -218,6 +218,7 @@ protected: const FunctionSamples *findCalleeFunctionSamples(const Instruction &I) const; std::vector<const FunctionSamples *> findIndirectCallFunctionSamples(const Instruction &I, uint64_t &Sum) const; + mutable DenseMap<const DILocation *, const FunctionSamples *> DILocation2SampleMap; const FunctionSamples *findFunctionSamples(const Instruction &I) const; bool inlineCallInstruction(Instruction *I); bool inlineHotFunctions(Function &F, @@ -719,12 +720,14 @@ SampleProfileLoader::findIndirectCallFunctionSamples( /// \returns the FunctionSamples pointer to the inlined instance. const FunctionSamples * SampleProfileLoader::findFunctionSamples(const Instruction &Inst) const { - SmallVector<std::pair<LineLocation, StringRef>, 10> S; const DILocation *DIL = Inst.getDebugLoc(); if (!DIL) 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) { @@ -1610,6 +1613,8 @@ bool SampleProfileLoaderLegacyPass::runOnModule(Module &M) { } bool SampleProfileLoader::runOnFunction(Function &F, ModuleAnalysisManager *AM) { + + DILocation2SampleMap.clear(); // By default the entry count is initialized to -1, which will be treated // 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 |