1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 19:23:23 +01:00

Add isHotBB helper function to ProfileSummaryInfo

Summary: This will unify all BB hotness checks.

Reviewers: eraman, davidxl

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D26353

llvm-svn: 286415
This commit is contained in:
Dehao Chen 2016-11-09 23:36:02 +00:00
parent 4486441607
commit a874afb484
2 changed files with 24 additions and 0 deletions

View File

@ -27,6 +27,8 @@
#include <memory>
namespace llvm {
class BasicBlock;
class BlockFrequencyInfo;
class ProfileSummary;
/// \brief Analysis providing profile information.
///
@ -59,6 +61,8 @@ public:
bool isHotCount(uint64_t C);
/// \brief Returns true if count \p C is considered cold.
bool isColdCount(uint64_t C);
/// \brief Returns true if BasicBlock \p B is considered hot.
bool isHotBB(const BasicBlock *B, BlockFrequencyInfo *BFI);
};
/// An analysis pass based on legacy pass manager to deliver ProfileSummaryInfo.

View File

@ -12,7 +12,9 @@
//
//===----------------------------------------------------------------------===//
#include "llvm/Analysis/BlockFrequencyInfo.h"
#include "llvm/Analysis/ProfileSummaryInfo.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/ProfileSummary.h"
@ -121,6 +123,24 @@ bool ProfileSummaryInfo::isColdCount(uint64_t C) {
return ColdCountThreshold && C <= ColdCountThreshold.getValue();
}
bool ProfileSummaryInfo::isHotBB(const BasicBlock *B, BlockFrequencyInfo *BFI) {
auto Count = BFI->getBlockProfileCount(B);
if (Count && isHotCount(*Count))
return true;
// Use extractProfTotalWeight to get BB count.
// For Sample PGO, BFI may not provide accurate BB count due to errors
// magnified during sample count propagation. This serves as a backup plan
// to ensure all hot BB will not be missed.
// The query currently has false positives as branch instruction cloning does
// not update/scale branch weights. Unlike false negatives, this will not cause
// performance problem.
uint64_t TotalCount;
if (B->getTerminator()->extractProfTotalWeight(TotalCount) &&
isHotCount(TotalCount))
return true;
return false;
}
INITIALIZE_PASS(ProfileSummaryInfoWrapperPass, "profile-summary-info",
"Profile summary info", false, true)