mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-18 13:16:24 -04:00
Add optional arg to profile count getters to filter
synthetic profile count. Differential Revision: http://reviews.llvm.org/D61025 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@359131 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -67,7 +67,8 @@ public:
|
||||
/// Returns the estimated profile count of \p BB.
|
||||
/// This computes the relative block frequency of \p BB and multiplies it by
|
||||
/// the enclosing function's count (if available) and returns the value.
|
||||
Optional<uint64_t> getBlockProfileCount(const BasicBlock *BB) const;
|
||||
Optional<uint64_t> getBlockProfileCount(const BasicBlock *BB,
|
||||
bool AllowSynthetic = false) const;
|
||||
|
||||
/// Returns the estimated profile count of \p Freq.
|
||||
/// This uses the frequency \p Freq and multiplies it by
|
||||
|
||||
@@ -520,9 +520,11 @@ public:
|
||||
|
||||
BlockFrequency getBlockFreq(const BlockNode &Node) const;
|
||||
Optional<uint64_t> getBlockProfileCount(const Function &F,
|
||||
const BlockNode &Node) const;
|
||||
const BlockNode &Node,
|
||||
bool AllowSynthetic = false) const;
|
||||
Optional<uint64_t> getProfileCountFromFreq(const Function &F,
|
||||
uint64_t Freq) const;
|
||||
uint64_t Freq,
|
||||
bool AllowSynthetic = false) const;
|
||||
bool isIrrLoopHeader(const BlockNode &Node);
|
||||
|
||||
void setBlockFreq(const BlockNode &Node, uint64_t Freq);
|
||||
@@ -968,13 +970,17 @@ public:
|
||||
}
|
||||
|
||||
Optional<uint64_t> getBlockProfileCount(const Function &F,
|
||||
const BlockT *BB) const {
|
||||
return BlockFrequencyInfoImplBase::getBlockProfileCount(F, getNode(BB));
|
||||
const BlockT *BB,
|
||||
bool AllowSynthetic = false) const {
|
||||
return BlockFrequencyInfoImplBase::getBlockProfileCount(F, getNode(BB),
|
||||
AllowSynthetic);
|
||||
}
|
||||
|
||||
Optional<uint64_t> getProfileCountFromFreq(const Function &F,
|
||||
uint64_t Freq) const {
|
||||
return BlockFrequencyInfoImplBase::getProfileCountFromFreq(F, Freq);
|
||||
uint64_t Freq,
|
||||
bool AllowSynthetic = false) const {
|
||||
return BlockFrequencyInfoImplBase::getProfileCountFromFreq(F, Freq,
|
||||
AllowSynthetic);
|
||||
}
|
||||
|
||||
bool isIrrLoopHeader(const BlockT *BB) {
|
||||
|
||||
@@ -92,7 +92,8 @@ public:
|
||||
|
||||
/// Returns the profile count for \p CallInst.
|
||||
Optional<uint64_t> getProfileCount(const Instruction *CallInst,
|
||||
BlockFrequencyInfo *BFI);
|
||||
BlockFrequencyInfo *BFI,
|
||||
bool AllowSynthetic = false);
|
||||
/// Returns true if the working set size of the code is considered huge.
|
||||
bool hasHugeWorkingSetSize();
|
||||
/// Returns true if \p F has hot function entry.
|
||||
|
||||
@@ -296,15 +296,18 @@ public:
|
||||
|
||||
/// Get the entry count for this function.
|
||||
///
|
||||
/// Entry count is the number of times the function was executed based on
|
||||
/// pgo data.
|
||||
ProfileCount getEntryCount() const;
|
||||
/// Entry count is the number of times the function was executed.
|
||||
/// When AllowSynthetic is false, only pgo_data will be returned.
|
||||
ProfileCount getEntryCount(bool AllowSynthetic = false) const;
|
||||
|
||||
/// Return true if the function is annotated with profile data.
|
||||
///
|
||||
/// Presence of entry counts from a profile run implies the function has
|
||||
/// profile annotations.
|
||||
bool hasProfileData() const { return getEntryCount().hasValue(); }
|
||||
/// profile annotations. If IncludeSynthetic is false, only return true
|
||||
/// when the profile data is real.
|
||||
bool hasProfileData(bool IncludeSynthetic = false) const {
|
||||
return getEntryCount(IncludeSynthetic).hasValue();
|
||||
}
|
||||
|
||||
/// Returns the set of GUIDs that needs to be imported to the function for
|
||||
/// sample PGO, to enable the same inlines as the profiled optimized binary.
|
||||
|
||||
@@ -203,11 +203,12 @@ BlockFrequency BlockFrequencyInfo::getBlockFreq(const BasicBlock *BB) const {
|
||||
}
|
||||
|
||||
Optional<uint64_t>
|
||||
BlockFrequencyInfo::getBlockProfileCount(const BasicBlock *BB) const {
|
||||
BlockFrequencyInfo::getBlockProfileCount(const BasicBlock *BB,
|
||||
bool AllowSynthetic) const {
|
||||
if (!BFI)
|
||||
return None;
|
||||
|
||||
return BFI->getBlockProfileCount(*getFunction(), BB);
|
||||
return BFI->getBlockProfileCount(*getFunction(), BB, AllowSynthetic);
|
||||
}
|
||||
|
||||
Optional<uint64_t>
|
||||
|
||||
@@ -557,14 +557,17 @@ BlockFrequencyInfoImplBase::getBlockFreq(const BlockNode &Node) const {
|
||||
|
||||
Optional<uint64_t>
|
||||
BlockFrequencyInfoImplBase::getBlockProfileCount(const Function &F,
|
||||
const BlockNode &Node) const {
|
||||
return getProfileCountFromFreq(F, getBlockFreq(Node).getFrequency());
|
||||
const BlockNode &Node,
|
||||
bool AllowSynthetic) const {
|
||||
return getProfileCountFromFreq(F, getBlockFreq(Node).getFrequency(),
|
||||
AllowSynthetic);
|
||||
}
|
||||
|
||||
Optional<uint64_t>
|
||||
BlockFrequencyInfoImplBase::getProfileCountFromFreq(const Function &F,
|
||||
uint64_t Freq) const {
|
||||
auto EntryCount = F.getEntryCount();
|
||||
uint64_t Freq,
|
||||
bool AllowSynthetic) const {
|
||||
auto EntryCount = F.getEntryCount(AllowSynthetic);
|
||||
if (!EntryCount)
|
||||
return None;
|
||||
// Use 128 bit APInt to do the arithmetic to avoid overflow.
|
||||
|
||||
@@ -95,7 +95,8 @@ bool ProfileSummaryInfo::computeSummary() {
|
||||
|
||||
Optional<uint64_t>
|
||||
ProfileSummaryInfo::getProfileCount(const Instruction *Inst,
|
||||
BlockFrequencyInfo *BFI) {
|
||||
BlockFrequencyInfo *BFI,
|
||||
bool AllowSynthetic) {
|
||||
if (!Inst)
|
||||
return None;
|
||||
assert((isa<CallInst>(Inst) || isa<InvokeInst>(Inst)) &&
|
||||
@@ -111,7 +112,7 @@ ProfileSummaryInfo::getProfileCount(const Instruction *Inst,
|
||||
return None;
|
||||
}
|
||||
if (BFI)
|
||||
return BFI->getBlockProfileCount(Inst->getParent());
|
||||
return BFI->getBlockProfileCount(Inst->getParent(), AllowSynthetic);
|
||||
return None;
|
||||
}
|
||||
|
||||
|
||||
+3
-2
@@ -1381,7 +1381,7 @@ void Function::setEntryCount(uint64_t Count, Function::ProfileCountType Type,
|
||||
setEntryCount(ProfileCount(Count, Type), Imports);
|
||||
}
|
||||
|
||||
ProfileCount Function::getEntryCount() const {
|
||||
ProfileCount Function::getEntryCount(bool AllowSynthetic) const {
|
||||
MDNode *MD = getMetadata(LLVMContext::MD_prof);
|
||||
if (MD && MD->getOperand(0))
|
||||
if (MDString *MDS = dyn_cast<MDString>(MD->getOperand(0))) {
|
||||
@@ -1393,7 +1393,8 @@ ProfileCount Function::getEntryCount() const {
|
||||
if (Count == (uint64_t)-1)
|
||||
return ProfileCount::getInvalid();
|
||||
return ProfileCount(Count, PCT_Real);
|
||||
} else if (MDS->getString().equals("synthetic_function_entry_count")) {
|
||||
} else if (AllowSynthetic &&
|
||||
MDS->getString().equals("synthetic_function_entry_count")) {
|
||||
ConstantInt *CI = mdconst::extract<ConstantInt>(MD->getOperand(1));
|
||||
uint64_t Count = CI->getValue().getZExtValue();
|
||||
return ProfileCount(Count, PCT_Synthetic);
|
||||
|
||||
@@ -2752,7 +2752,7 @@ TEST_F(FunctionAttachmentTest, EntryCount) {
|
||||
F = getFunction("bar");
|
||||
EXPECT_FALSE(F->getEntryCount().hasValue());
|
||||
F->setEntryCount(123, Function::PCT_Synthetic);
|
||||
Count = F->getEntryCount();
|
||||
Count = F->getEntryCount(true /*allow synthetic*/);
|
||||
EXPECT_TRUE(Count.hasValue());
|
||||
EXPECT_EQ(123u, Count.getCount());
|
||||
EXPECT_EQ(Function::PCT_Synthetic, Count.getType());
|
||||
|
||||
Reference in New Issue
Block a user