Handle early inline for hot callsites that reside in the same basic block.
Summary: Callsites in the same basic block should share the same hotness. This patch checks for the hottest callsite in the same basic block, and use the hotness for all callsites in that basic block for early inline decisions. It also fixes the test to add "-S" so theat the "CHECK-NOT" is actually checking the content. Reviewers: dnovillo Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D24734 llvm-svn: 281927
This commit is contained in:
parent
552d012b7e
commit
20866ed57e
|
@ -638,15 +638,20 @@ bool SampleProfileLoader::inlineHotFunctions(Function &F) {
|
|||
bool LocalChanged = false;
|
||||
SmallVector<Instruction *, 10> CIS;
|
||||
for (auto &BB : F) {
|
||||
bool Hot = false;
|
||||
SmallVector<Instruction *, 10> Candidates;
|
||||
for (auto &I : BB.getInstList()) {
|
||||
const FunctionSamples *FS = nullptr;
|
||||
if ((isa<CallInst>(I) || isa<InvokeInst>(I)) &&
|
||||
(FS = findCalleeFunctionSamples(I))) {
|
||||
|
||||
Candidates.push_back(&I);
|
||||
if (callsiteIsHot(Samples, FS))
|
||||
CIS.push_back(&I);
|
||||
Hot = true;
|
||||
}
|
||||
}
|
||||
if (Hot) {
|
||||
CIS.insert(CIS.begin(), Candidates.begin(), Candidates.end());
|
||||
}
|
||||
}
|
||||
for (auto I : CIS) {
|
||||
InlineFunctionInfo IFI(nullptr, ACT ? &GetAssumptionCache : nullptr);
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
_Z3foov:200:100
|
||||
1: _Z3barv:100
|
||||
1: _Z3barv:0
|
||||
3: _Z3barv:100
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; RUN: opt < %s -instcombine -sample-profile -sample-profile-file=%S/Inputs/einline.prof | FileCheck %s
|
||||
; RUN: opt < %s -instcombine -sample-profile -sample-profile-file=%S/Inputs/einline.prof -S | FileCheck %s
|
||||
|
||||
; Checks if both call and invoke can be inlined early if their inlined
|
||||
; instances are hot in profile.
|
||||
|
|
Loading…
Reference in New Issue