summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXinliang David Li <davidxl@google.com>2019-04-24 19:51:16 +0000
committerXinliang David Li <davidxl@google.com>2019-04-24 19:51:16 +0000
commit499c80b89015cf0fa744b228518b5f6632e8c989 (patch)
treed246a3dcdc237c1f2bb26567f1d64627a6f2fa1d
parentd129ee34a51e44c9d46a1bf646a12dbf9b438996 (diff)
downloadbcm5719-llvm-499c80b89015cf0fa744b228518b5f6632e8c989.tar.gz
bcm5719-llvm-499c80b89015cf0fa744b228518b5f6632e8c989.zip
Add optional arg to profile count getters to filter
synthetic profile count. Differential Revision: http://reviews.llvm.org/D61025 llvm-svn: 359131
-rw-r--r--llvm/include/llvm/Analysis/BlockFrequencyInfo.h3
-rw-r--r--llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h18
-rw-r--r--llvm/include/llvm/Analysis/ProfileSummaryInfo.h3
-rw-r--r--llvm/include/llvm/IR/Function.h13
-rw-r--r--llvm/lib/Analysis/BlockFrequencyInfo.cpp5
-rw-r--r--llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp11
-rw-r--r--llvm/lib/Analysis/ProfileSummaryInfo.cpp5
-rw-r--r--llvm/lib/IR/Function.cpp5
-rw-r--r--llvm/unittests/IR/MetadataTest.cpp2
9 files changed, 41 insertions, 24 deletions
diff --git a/llvm/include/llvm/Analysis/BlockFrequencyInfo.h b/llvm/include/llvm/Analysis/BlockFrequencyInfo.h
index c73c7faba0e..8bcfd7ff8f5 100644
--- a/llvm/include/llvm/Analysis/BlockFrequencyInfo.h
+++ b/llvm/include/llvm/Analysis/BlockFrequencyInfo.h
@@ -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
diff --git a/llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h b/llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h
index 813bad49888..bfe4fb14a2b 100644
--- a/llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h
+++ b/llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h
@@ -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) {
diff --git a/llvm/include/llvm/Analysis/ProfileSummaryInfo.h b/llvm/include/llvm/Analysis/ProfileSummaryInfo.h
index 1b1112f1a66..f309d344b8d 100644
--- a/llvm/include/llvm/Analysis/ProfileSummaryInfo.h
+++ b/llvm/include/llvm/Analysis/ProfileSummaryInfo.h
@@ -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.
diff --git a/llvm/include/llvm/IR/Function.h b/llvm/include/llvm/IR/Function.h
index efa1428840e..613d21bc64d 100644
--- a/llvm/include/llvm/IR/Function.h
+++ b/llvm/include/llvm/IR/Function.h
@@ -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.
diff --git a/llvm/lib/Analysis/BlockFrequencyInfo.cpp b/llvm/lib/Analysis/BlockFrequencyInfo.cpp
index 398303dd31b..de183bbde17 100644
--- a/llvm/lib/Analysis/BlockFrequencyInfo.cpp
+++ b/llvm/lib/Analysis/BlockFrequencyInfo.cpp
@@ -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>
diff --git a/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp b/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp
index f0b9ea6f553..0db6dd04a7e 100644
--- a/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp
+++ b/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp
@@ -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.
diff --git a/llvm/lib/Analysis/ProfileSummaryInfo.cpp b/llvm/lib/Analysis/ProfileSummaryInfo.cpp
index 1f9e9813c76..682f15d054d 100644
--- a/llvm/lib/Analysis/ProfileSummaryInfo.cpp
+++ b/llvm/lib/Analysis/ProfileSummaryInfo.cpp
@@ -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;
}
diff --git a/llvm/lib/IR/Function.cpp b/llvm/lib/IR/Function.cpp
index 574ca88e1c9..70a0dbc28b6 100644
--- a/llvm/lib/IR/Function.cpp
+++ b/llvm/lib/IR/Function.cpp
@@ -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);
diff --git a/llvm/unittests/IR/MetadataTest.cpp b/llvm/unittests/IR/MetadataTest.cpp
index 7b9b7c4d898..8529364e4f9 100644
--- a/llvm/unittests/IR/MetadataTest.cpp
+++ b/llvm/unittests/IR/MetadataTest.cpp
@@ -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());
OpenPOWER on IntegriCloud