Index: lib/Transforms/IPO/SampleProfile.cpp =================================================================== --- lib/Transforms/IPO/SampleProfile.cpp +++ lib/Transforms/IPO/SampleProfile.cpp @@ -215,10 +215,11 @@ bool emitAnnotations(Function &F); ErrorOr getInstWeight(const Instruction &I); ErrorOr getBlockWeight(const BasicBlock *BB); - const FunctionSamples *findCalleeFunctionSamples(const Instruction &I) const; + const FunctionSamples *findCalleeFunctionSamples(const Instruction &I); std::vector - findIndirectCallFunctionSamples(const Instruction &I, uint64_t &Sum) const; - const FunctionSamples *findFunctionSamples(const Instruction &I) const; + findIndirectCallFunctionSamples(const Instruction &I, uint64_t &Sum); + DenseMap DILocation2SampleMap; + const FunctionSamples *findFunctionSamples(const Instruction &I); bool inlineCallInstruction(Instruction *I); bool inlineHotFunctions(Function &F, DenseSet &InlinedGUIDs); @@ -645,7 +646,7 @@ /// /// \returns The FunctionSamples pointer to the inlined instance. const FunctionSamples * -SampleProfileLoader::findCalleeFunctionSamples(const Instruction &Inst) const { +SampleProfileLoader::findCalleeFunctionSamples(const Instruction &Inst) { const DILocation *DIL = Inst.getDebugLoc(); if (!DIL) { return nullptr; @@ -669,8 +670,8 @@ /// of \p Inst. The vector is sorted by the total number of samples. Stores /// the total call count of the indirect call in \p Sum. std::vector -SampleProfileLoader::findIndirectCallFunctionSamples( - const Instruction &Inst, uint64_t &Sum) const { +SampleProfileLoader::findIndirectCallFunctionSamples(const Instruction &Inst, + uint64_t &Sum) { const DILocation *DIL = Inst.getDebugLoc(); std::vector R; @@ -718,13 +719,17 @@ /// /// \returns the FunctionSamples pointer to the inlined instance. const FunctionSamples * -SampleProfileLoader::findFunctionSamples(const Instruction &Inst) const { +SampleProfileLoader::findFunctionSamples(const Instruction &Inst) { SmallVector, 10> S; const DILocation *DIL = Inst.getDebugLoc(); if (!DIL) return Samples; - - return Samples->findFunctionSamples(DIL); + auto it = DILocation2SampleMap.find(DIL); + if (it != DILocation2SampleMap.end()) + return it->second; + const FunctionSamples *s = Samples->findFunctionSamples(DIL); + DILocation2SampleMap.try_emplace(DIL, s); + return s; } bool SampleProfileLoader::inlineCallInstruction(Instruction *I) {