mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
Add hasProfileData() to check if a function has profile data. NFC.
Summary: This replaces calls to getEntryCount().hasValue() with hasProfileData that does the same thing. This refactoring is useful to do before adding synthetic function entry counts but also a useful cleanup IMO even otherwise. I have used hasProfileData instead of hasRealProfileData as David had earlier suggested since I think profile implies "real" and I use the phrase "synthetic entry count" and not "synthetic profile count" but I am fine calling it hasRealProfileData if you prefer. Reviewers: davidxl, silvas Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D41461 llvm-svn: 321331
This commit is contained in:
parent
83867e3150
commit
6f3c3a50fb
@ -248,6 +248,12 @@ public:
|
||||
/// pgo data.
|
||||
Optional<uint64_t> getEntryCount() 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(); }
|
||||
|
||||
/// 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.
|
||||
DenseSet<GlobalValue::GUID> getImportGUIDs() const;
|
||||
|
@ -454,7 +454,7 @@ ModuleSummaryIndex llvm::buildModuleSummaryIndex(
|
||||
std::unique_ptr<BlockFrequencyInfo> BFIPtr;
|
||||
if (GetBFICallback)
|
||||
BFI = GetBFICallback(F);
|
||||
else if (F.getEntryCount().hasValue()) {
|
||||
else if (F.hasProfileData()) {
|
||||
LoopInfo LI{DominatorTree(const_cast<Function &>(F))};
|
||||
BranchProbabilityInfo BPI{F, LI};
|
||||
BFIPtr = llvm::make_unique<BlockFrequencyInfo>(F, BPI, LI);
|
||||
|
@ -251,7 +251,7 @@ bool ProfileSummaryInfo::isColdCallSite(const CallSite &CS,
|
||||
// If there is no profile for the caller, and we know the profile is
|
||||
// accurate, we consider the callsite as cold.
|
||||
return (hasSampleProfile() &&
|
||||
(CS.getCaller()->getEntryCount() || ProfileSampleAccurate ||
|
||||
(CS.getCaller()->hasProfileData() || ProfileSampleAccurate ||
|
||||
CS.getCaller()->hasFnAttribute("profile-sample-accurate")));
|
||||
}
|
||||
|
||||
|
@ -3371,7 +3371,7 @@ void ModuleBitcodeWriterBase::writePerModuleFunctionSummaryRecord(
|
||||
for (auto &RI : FS->refs())
|
||||
NameVals.push_back(VE.getValueID(RI.getValue()));
|
||||
|
||||
bool HasProfileData = F.getEntryCount().hasValue();
|
||||
bool HasProfileData = F.hasProfileData();
|
||||
for (auto &ECI : FS->calls()) {
|
||||
NameVals.push_back(getValueId(ECI.first));
|
||||
if (HasProfileData)
|
||||
|
@ -1235,7 +1235,7 @@ void MachineBlockPlacement::precomputeTriangleChains() {
|
||||
// When profile is available, we need to handle the triangle-shape CFG.
|
||||
static BranchProbability getLayoutSuccessorProbThreshold(
|
||||
const MachineBasicBlock *BB) {
|
||||
if (!BB->getParent()->getFunction().getEntryCount())
|
||||
if (!BB->getParent()->getFunction().hasProfileData())
|
||||
return BranchProbability(StaticLikelyProb, 100);
|
||||
if (BB->succ_size() == 2) {
|
||||
const MachineBasicBlock *Succ1 = *BB->succ_begin();
|
||||
@ -2178,7 +2178,7 @@ MachineBlockPlacement::collectLoopBlockSet(const MachineLoop &L) {
|
||||
// will be merged into the first outer loop chain for which this block is not
|
||||
// cold anymore. This needs precise profile data and we only do this when
|
||||
// profile data is available.
|
||||
if (F->getFunction().getEntryCount() || ForceLoopColdBlock) {
|
||||
if (F->getFunction().hasProfileData() || ForceLoopColdBlock) {
|
||||
BlockFrequency LoopFreq(0);
|
||||
for (auto LoopPred : L.getHeader()->predecessors())
|
||||
if (!L.contains(LoopPred))
|
||||
@ -2220,7 +2220,7 @@ void MachineBlockPlacement::buildLoopChains(const MachineLoop &L) {
|
||||
// for better layout.
|
||||
bool RotateLoopWithProfile =
|
||||
ForcePreciseRotationCost ||
|
||||
(PreciseRotationCost && F->getFunction().getEntryCount());
|
||||
(PreciseRotationCost && F->getFunction().hasProfileData());
|
||||
|
||||
// First check to see if there is an obviously preferable top block for the
|
||||
// loop. This will default to the header, but may end up as one of the
|
||||
|
@ -710,7 +710,7 @@ PartialInlinerImpl::computeOutliningInfo(Function *F) {
|
||||
|
||||
// Check if there is PGO data or user annoated branch data:
|
||||
static bool hasProfileData(Function *F, FunctionOutliningInfo *OI) {
|
||||
if (F->getEntryCount())
|
||||
if (F->hasProfileData())
|
||||
return true;
|
||||
// Now check if any of the entry block has MD_prof data:
|
||||
for (auto *E : OI->Entries) {
|
||||
@ -1274,7 +1274,7 @@ std::pair<bool, Function *> PartialInlinerImpl::unswitchFunction(Function *F) {
|
||||
|
||||
// Only try to outline cold regions if we have a profile summary, which
|
||||
// implies we have profiling information.
|
||||
if (PSI->hasProfileSummary() && F->getEntryCount().hasValue() &&
|
||||
if (PSI->hasProfileSummary() && F->hasProfileData() &&
|
||||
!DisableMultiRegionPartialInline) {
|
||||
std::unique_ptr<FunctionOutliningMultiRegionInfo> OMRI =
|
||||
computeOutliningColdRegionsInfo(F);
|
||||
@ -1380,10 +1380,10 @@ bool PartialInlinerImpl::tryPartialInline(FunctionCloner &Cloner) {
|
||||
Cloner.ClonedFunc->user_end());
|
||||
|
||||
DenseMap<User *, uint64_t> CallSiteToProfCountMap;
|
||||
if (Cloner.OrigFunc->getEntryCount())
|
||||
auto CalleeEntryCount = Cloner.OrigFunc->getEntryCount();
|
||||
if (CalleeEntryCount)
|
||||
computeCallsiteToProfCountMap(Cloner.ClonedFunc, CallSiteToProfCountMap);
|
||||
|
||||
auto CalleeEntryCount = Cloner.OrigFunc->getEntryCount();
|
||||
uint64_t CalleeEntryCountV = (CalleeEntryCount ? *CalleeEntryCount : 0);
|
||||
|
||||
bool AnyInline = false;
|
||||
|
@ -282,7 +282,7 @@ bool JumpThreading::runOnFunction(Function &F) {
|
||||
auto AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
|
||||
std::unique_ptr<BlockFrequencyInfo> BFI;
|
||||
std::unique_ptr<BranchProbabilityInfo> BPI;
|
||||
bool HasProfileData = F.getEntryCount().hasValue();
|
||||
bool HasProfileData = F.hasProfileData();
|
||||
if (HasProfileData) {
|
||||
LoopInfo LI{DominatorTree(F)};
|
||||
BPI.reset(new BranchProbabilityInfo(F, LI, TLI));
|
||||
@ -307,8 +307,7 @@ PreservedAnalyses JumpThreadingPass::run(Function &F,
|
||||
|
||||
std::unique_ptr<BlockFrequencyInfo> BFI;
|
||||
std::unique_ptr<BranchProbabilityInfo> BPI;
|
||||
bool HasProfileData = F.getEntryCount().hasValue();
|
||||
if (HasProfileData) {
|
||||
if (F.hasProfileData()) {
|
||||
LoopInfo LI{DominatorTree(F)};
|
||||
BPI.reset(new BranchProbabilityInfo(F, LI, &TLI));
|
||||
BFI.reset(new BlockFrequencyInfo(F, *BPI, LI));
|
||||
|
@ -247,7 +247,7 @@ static bool sinkLoopInvariantInstructions(Loop &L, AAResults &AA, LoopInfo &LI,
|
||||
|
||||
// Enable LoopSink only when runtime profile is available.
|
||||
// With static profile, the sinking decision may be sub-optimal.
|
||||
if (!Preheader->getParent()->getEntryCount())
|
||||
if (!Preheader->getParent()->hasProfileData())
|
||||
return false;
|
||||
|
||||
const BlockFrequency PreheaderFreq = BFI.getBlockFreq(Preheader);
|
||||
|
@ -882,7 +882,7 @@ static bool computeUnrollCount(
|
||||
}
|
||||
|
||||
// Check if the runtime trip count is too small when profile is available.
|
||||
if (L->getHeader()->getParent()->getEntryCount()) {
|
||||
if (L->getHeader()->getParent()->hasProfileData()) {
|
||||
if (auto ProfileTripCount = getLoopEstimatedTripCount(L)) {
|
||||
if (*ProfileTripCount < FlatLoopTripCountThreshold)
|
||||
return false;
|
||||
|
@ -203,7 +203,7 @@ void llvm::computePeelCount(Loop *L, unsigned LoopSize,
|
||||
// hit the peeled section.
|
||||
// We only do this in the presence of profile information, since otherwise
|
||||
// our estimates of the trip count are not reliable enough.
|
||||
if (UP.AllowPeeling && L->getHeader()->getParent()->getEntryCount()) {
|
||||
if (UP.AllowPeeling && L->getHeader()->getParent()->hasProfileData()) {
|
||||
Optional<unsigned> PeelCount = getLoopEstimatedTripCount(L);
|
||||
if (!PeelCount)
|
||||
return;
|
||||
|
Loading…
Reference in New Issue
Block a user