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> #include <memory>
namespace llvm { namespace llvm {
class BasicBlock;
class BlockFrequencyInfo;
class ProfileSummary; class ProfileSummary;
/// \brief Analysis providing profile information. /// \brief Analysis providing profile information.
/// ///
@ -59,6 +61,8 @@ public:
bool isHotCount(uint64_t C); bool isHotCount(uint64_t C);
/// \brief Returns true if count \p C is considered cold. /// \brief Returns true if count \p C is considered cold.
bool isColdCount(uint64_t C); 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. /// 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/Analysis/ProfileSummaryInfo.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Metadata.h" #include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h" #include "llvm/IR/Module.h"
#include "llvm/IR/ProfileSummary.h" #include "llvm/IR/ProfileSummary.h"
@ -121,6 +123,24 @@ bool ProfileSummaryInfo::isColdCount(uint64_t C) {
return ColdCountThreshold && C <= ColdCountThreshold.getValue(); 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", INITIALIZE_PASS(ProfileSummaryInfoWrapperPass, "profile-summary-info",
"Profile summary info", false, true) "Profile summary info", false, true)