Index: lib/Transforms/IPO/SampleProfile.cpp =================================================================== --- lib/Transforms/IPO/SampleProfile.cpp +++ lib/Transforms/IPO/SampleProfile.cpp @@ -638,15 +638,20 @@ bool LocalChanged = false; SmallVector CIS; for (auto &BB : F) { + bool Hot = false; + SmallVector Candidates; for (auto &I : BB.getInstList()) { const FunctionSamples *FS = nullptr; if ((isa(I) || isa(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); Index: test/Transforms/SampleProfile/Inputs/einline.prof =================================================================== --- test/Transforms/SampleProfile/Inputs/einline.prof +++ test/Transforms/SampleProfile/Inputs/einline.prof @@ -1,3 +1,3 @@ _Z3foov:200:100 - 1: _Z3barv:100 + 1: _Z3barv:0 3: _Z3barv:100 Index: test/Transforms/SampleProfile/early-inline.ll =================================================================== --- test/Transforms/SampleProfile/early-inline.ll +++ test/Transforms/SampleProfile/early-inline.ll @@ -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.