Skip to content
This repository was archived by the owner on Apr 23, 2020. It is now read-only.

Commit 77fc8fc

Browse files
committed
[SampleProf] NFC. Expose reusable functionality in SampleProfile.
Summary: Exposing getOffset and findFunctionSamples as members of SampleProfile. They are intimately tied to design choices of the sample profile format - using offsets instead of line numbers, and traversing inlined functions stack, respectively. Reviewers: davidxl Reviewed By: davidxl Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D43605 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@325747 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 3f84050 commit 77fc8fc

File tree

3 files changed

+53
-29
lines changed

3 files changed

+53
-29
lines changed

include/llvm/ProfileData/SampleProf.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,23 @@ class FunctionSamples {
383383
/// Return the function name.
384384
const StringRef &getName() const { return Name; }
385385

386+
/// Returns the line offset to the start line of the subprogram.
387+
/// We assume that a single function will not exceed 65535 LOC.
388+
static unsigned getOffset(const DILocation *DIL);
389+
390+
/// \brief Get the FunctionSamples of the inline instance where DIL originates
391+
/// from.
392+
///
393+
/// The FunctionSamples of the instruction (Machine or IR) associated to
394+
/// \p DIL is the inlined instance in which that instruction is coming from.
395+
/// We traverse the inline stack of that instruction, and match it with the
396+
/// tree nodes in the profile.
397+
///
398+
/// \param Inst Instruction to query.
399+
///
400+
/// \returns the FunctionSamples pointer to the inlined instance.
401+
const FunctionSamples *findFunctionSamples(const DILocation *DIL) const;
402+
386403
private:
387404
/// Mangled name of the function.
388405
StringRef Name;

lib/ProfileData/SampleProf.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15+
#include "llvm/IR/DebugInfoMetadata.h"
1516
#include "llvm/ProfileData/SampleProf.h"
1617
#include "llvm/Support/Compiler.h"
1718
#include "llvm/Support/Debug.h"
@@ -150,6 +151,32 @@ raw_ostream &llvm::sampleprof::operator<<(raw_ostream &OS,
150151
return OS;
151152
}
152153

154+
unsigned FunctionSamples::getOffset(const DILocation *DIL) {
155+
return (DIL->getLine() - DIL->getScope()->getSubprogram()->getLine()) &
156+
0xffff;
157+
}
158+
159+
const FunctionSamples *
160+
FunctionSamples::findFunctionSamples(const DILocation *DIL) const {
161+
assert(DIL);
162+
SmallVector<std::pair<LineLocation, StringRef>, 10> S;
163+
164+
const DILocation *PrevDIL = DIL;
165+
for (DIL = DIL->getInlinedAt(); DIL; DIL = DIL->getInlinedAt()) {
166+
S.push_back(std::make_pair(
167+
LineLocation(getOffset(DIL), DIL->getBaseDiscriminator()),
168+
PrevDIL->getScope()->getSubprogram()->getLinkageName()));
169+
PrevDIL = DIL;
170+
}
171+
if (S.size() == 0)
172+
return this;
173+
const FunctionSamples *FS = this;
174+
for (int i = S.size() - 1; i >= 0 && FS != nullptr; i--) {
175+
FS = FS->findFunctionSamplesAt(S[i].first, S[i].second);
176+
}
177+
return FS;
178+
}
179+
153180
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
154181
LLVM_DUMP_METHOD void FunctionSamples::dump() const { print(dbgs(), 0); }
155182
#endif

lib/Transforms/IPO/SampleProfile.cpp

Lines changed: 9 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,6 @@ class SampleProfileLoader {
217217
void buildEdges(Function &F);
218218
bool propagateThroughEdges(Function &F, bool UpdateBlockCount);
219219
void computeDominanceAndLoopInfo(Function &F);
220-
unsigned getOffset(const DILocation *DIL) const;
221220
void clearFunctionData();
222221

223222
/// \brief Map basic blocks to their computed weights.
@@ -473,13 +472,6 @@ void SampleProfileLoader::clearFunctionData() {
473472
CoverageTracker.clear();
474473
}
475474

476-
/// Returns the line offset to the start line of the subprogram.
477-
/// We assume that a single function will not exceed 65535 LOC.
478-
unsigned SampleProfileLoader::getOffset(const DILocation *DIL) const {
479-
return (DIL->getLine() - DIL->getScope()->getSubprogram()->getLine()) &
480-
0xffff;
481-
}
482-
483475
#ifndef NDEBUG
484476
/// \brief Print the weight of edge \p E on stream \p OS.
485477
///
@@ -549,7 +541,7 @@ ErrorOr<uint64_t> SampleProfileLoader::getInstWeight(const Instruction &Inst) {
549541
return 0;
550542

551543
const DILocation *DIL = DLoc;
552-
uint32_t LineOffset = getOffset(DIL);
544+
uint32_t LineOffset = FunctionSamples::getOffset(DIL);
553545
uint32_t Discriminator = DIL->getBaseDiscriminator();
554546
ErrorOr<uint64_t> R = FS->findSamplesAt(LineOffset, Discriminator);
555547
if (R) {
@@ -649,8 +641,9 @@ SampleProfileLoader::findCalleeFunctionSamples(const Instruction &Inst) const {
649641
if (FS == nullptr)
650642
return nullptr;
651643

652-
return FS->findFunctionSamplesAt(
653-
LineLocation(getOffset(DIL), DIL->getBaseDiscriminator()), CalleeName);
644+
return FS->findFunctionSamplesAt(LineLocation(FunctionSamples::getOffset(DIL),
645+
DIL->getBaseDiscriminator()),
646+
CalleeName);
654647
}
655648

656649
/// Returns a vector of FunctionSamples that are the indirect call targets
@@ -670,16 +663,16 @@ SampleProfileLoader::findIndirectCallFunctionSamples(
670663
if (FS == nullptr)
671664
return R;
672665

673-
uint32_t LineOffset = getOffset(DIL);
666+
uint32_t LineOffset = FunctionSamples::getOffset(DIL);
674667
uint32_t Discriminator = DIL->getBaseDiscriminator();
675668

676669
auto T = FS->findCallTargetMapAt(LineOffset, Discriminator);
677670
Sum = 0;
678671
if (T)
679672
for (const auto &T_C : T.get())
680673
Sum += T_C.second;
681-
if (const FunctionSamplesMap *M = FS->findFunctionSamplesMapAt(
682-
LineLocation(getOffset(DIL), DIL->getBaseDiscriminator()))) {
674+
if (const FunctionSamplesMap *M = FS->findFunctionSamplesMapAt(LineLocation(
675+
FunctionSamples::getOffset(DIL), DIL->getBaseDiscriminator()))) {
683676
if (M->empty())
684677
return R;
685678
for (const auto &NameFS : *M) {
@@ -710,20 +703,7 @@ SampleProfileLoader::findFunctionSamples(const Instruction &Inst) const {
710703
if (!DIL)
711704
return Samples;
712705

713-
const DILocation *PrevDIL = DIL;
714-
for (DIL = DIL->getInlinedAt(); DIL; DIL = DIL->getInlinedAt()) {
715-
S.push_back(std::make_pair(
716-
LineLocation(getOffset(DIL), DIL->getBaseDiscriminator()),
717-
PrevDIL->getScope()->getSubprogram()->getLinkageName()));
718-
PrevDIL = DIL;
719-
}
720-
if (S.size() == 0)
721-
return Samples;
722-
const FunctionSamples *FS = Samples;
723-
for (int i = S.size() - 1; i >= 0 && FS != nullptr; i--) {
724-
FS = FS->findFunctionSamplesAt(S[i].first, S[i].second);
725-
}
726-
return FS;
706+
return Samples->findFunctionSamples(DIL);
727707
}
728708

729709
bool SampleProfileLoader::inlineCallInstruction(Instruction *I) {
@@ -1281,7 +1261,7 @@ void SampleProfileLoader::propagateWeights(Function &F) {
12811261
if (!DLoc)
12821262
continue;
12831263
const DILocation *DIL = DLoc;
1284-
uint32_t LineOffset = getOffset(DIL);
1264+
uint32_t LineOffset = FunctionSamples::getOffset(DIL);
12851265
uint32_t Discriminator = DIL->getBaseDiscriminator();
12861266

12871267
const FunctionSamples *FS = findFunctionSamples(I);

0 commit comments

Comments
 (0)