Update prebuilt Clang to r416183b from Android.
https://android.googlesource.com/platform/prebuilts/clang/host/
linux-x86/+/06a71ddac05c22edb2d10b590e1769b3f8619bef
clang 12.0.5 (based on r416183b) from build 7284624.
Change-Id: I277a316abcf47307562d8b748b84870f31a72866
Signed-off-by: Olivier Deprez <olivier.deprez@arm.com>
diff --git a/linux-x64/clang/include/llvm/Analysis/ProfileSummaryInfo.h b/linux-x64/clang/include/llvm/Analysis/ProfileSummaryInfo.h
index f309d34..a4e6ffc 100644
--- a/linux-x64/clang/include/llvm/Analysis/ProfileSummaryInfo.h
+++ b/linux-x64/clang/include/llvm/Analysis/ProfileSummaryInfo.h
@@ -14,22 +14,18 @@
#ifndef LLVM_ANALYSIS_PROFILE_SUMMARY_INFO_H
#define LLVM_ANALYSIS_PROFILE_SUMMARY_INFO_H
-#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
-#include "llvm/ADT/SmallSet.h"
-#include "llvm/IR/Function.h"
-#include "llvm/IR/Instructions.h"
#include "llvm/IR/PassManager.h"
#include "llvm/IR/ProfileSummary.h"
-#include "llvm/IR/ValueHandle.h"
#include "llvm/Pass.h"
#include <memory>
namespace llvm {
class BasicBlock;
class BlockFrequencyInfo;
-class CallSite;
-class ProfileSummary;
+class CallBase;
+class Function;
+
/// Analysis providing profile information.
///
/// This is an immutable analysis pass that provides ability to query global
@@ -42,9 +38,8 @@
// units. This would require making this depend on BFI.
class ProfileSummaryInfo {
private:
- Module &M;
+ const Module &M;
std::unique_ptr<ProfileSummary> Summary;
- bool computeSummary();
void computeThresholds();
// Count thresholds to answer isHotCount and isColdCount queries.
Optional<uint64_t> HotCountThreshold, ColdCountThreshold;
@@ -52,29 +47,41 @@
// because the number of profile counts required to reach the hot
// percentile is above a huge threshold.
Optional<bool> HasHugeWorkingSetSize;
+ // True if the working set size of the code is considered large,
+ // because the number of profile counts required to reach the hot
+ // percentile is above a large threshold.
+ Optional<bool> HasLargeWorkingSetSize;
+ // Compute the threshold for a given cutoff.
+ Optional<uint64_t> computeThreshold(int PercentileCutoff) const;
+ // The map that caches the threshold values. The keys are the percentile
+ // cutoff values and the values are the corresponding threshold values.
+ mutable DenseMap<int, uint64_t> ThresholdCache;
public:
- ProfileSummaryInfo(Module &M) : M(M) {}
- ProfileSummaryInfo(ProfileSummaryInfo &&Arg)
- : M(Arg.M), Summary(std::move(Arg.Summary)) {}
+ ProfileSummaryInfo(const Module &M) : M(M) { refresh(); }
+
+ ProfileSummaryInfo(ProfileSummaryInfo &&Arg) = default;
+
+ /// If no summary is present, attempt to refresh.
+ void refresh();
/// Returns true if profile summary is available.
- bool hasProfileSummary() { return computeSummary(); }
+ bool hasProfileSummary() const { return Summary != nullptr; }
/// Returns true if module \c M has sample profile.
- bool hasSampleProfile() {
+ bool hasSampleProfile() const {
return hasProfileSummary() &&
Summary->getKind() == ProfileSummary::PSK_Sample;
}
/// Returns true if module \c M has instrumentation profile.
- bool hasInstrumentationProfile() {
+ bool hasInstrumentationProfile() const {
return hasProfileSummary() &&
Summary->getKind() == ProfileSummary::PSK_Instr;
}
/// Returns true if module \c M has context sensitive instrumentation profile.
- bool hasCSInstrumentationProfile() {
+ bool hasCSInstrumentationProfile() const {
return hasProfileSummary() &&
Summary->getKind() == ProfileSummary::PSK_CSInstr;
}
@@ -91,45 +98,88 @@
}
/// Returns the profile count for \p CallInst.
- Optional<uint64_t> getProfileCount(const Instruction *CallInst,
+ Optional<uint64_t> getProfileCount(const CallBase &CallInst,
BlockFrequencyInfo *BFI,
- bool AllowSynthetic = false);
+ bool AllowSynthetic = false) const;
+ /// Returns true if module \c M has partial-profile sample profile.
+ bool hasPartialSampleProfile() const;
/// Returns true if the working set size of the code is considered huge.
- bool hasHugeWorkingSetSize();
+ bool hasHugeWorkingSetSize() const;
+ /// Returns true if the working set size of the code is considered large.
+ bool hasLargeWorkingSetSize() const;
/// Returns true if \p F has hot function entry.
- bool isFunctionEntryHot(const Function *F);
+ bool isFunctionEntryHot(const Function *F) const;
/// Returns true if \p F contains hot code.
- bool isFunctionHotInCallGraph(const Function *F, BlockFrequencyInfo &BFI);
+ bool isFunctionHotInCallGraph(const Function *F,
+ BlockFrequencyInfo &BFI) const;
/// Returns true if \p F has cold function entry.
- bool isFunctionEntryCold(const Function *F);
+ bool isFunctionEntryCold(const Function *F) const;
/// Returns true if \p F contains only cold code.
- bool isFunctionColdInCallGraph(const Function *F, BlockFrequencyInfo &BFI);
+ bool isFunctionColdInCallGraph(const Function *F,
+ BlockFrequencyInfo &BFI) const;
+ /// Returns true if the hotness of \p F is unknown.
+ bool isFunctionHotnessUnknown(const Function &F) const;
+ /// Returns true if \p F contains hot code with regard to a given hot
+ /// percentile cutoff value.
+ bool isFunctionHotInCallGraphNthPercentile(int PercentileCutoff,
+ const Function *F,
+ BlockFrequencyInfo &BFI) const;
+ /// Returns true if \p F contains cold code with regard to a given cold
+ /// percentile cutoff value.
+ bool isFunctionColdInCallGraphNthPercentile(int PercentileCutoff,
+ const Function *F,
+ BlockFrequencyInfo &BFI) const;
/// Returns true if count \p C is considered hot.
- bool isHotCount(uint64_t C);
+ bool isHotCount(uint64_t C) const;
/// Returns true if count \p C is considered cold.
- bool isColdCount(uint64_t C);
+ bool isColdCount(uint64_t C) const;
+ /// Returns true if count \p C is considered hot with regard to a given
+ /// hot percentile cutoff value.
+ bool isHotCountNthPercentile(int PercentileCutoff, uint64_t C) const;
+ /// Returns true if count \p C is considered cold with regard to a given
+ /// cold percentile cutoff value.
+ bool isColdCountNthPercentile(int PercentileCutoff, uint64_t C) const;
/// Returns true if BasicBlock \p BB is considered hot.
- bool isHotBlock(const BasicBlock *BB, BlockFrequencyInfo *BFI);
+ bool isHotBlock(const BasicBlock *BB, BlockFrequencyInfo *BFI) const;
/// Returns true if BasicBlock \p BB is considered cold.
- bool isColdBlock(const BasicBlock *BB, BlockFrequencyInfo *BFI);
- /// Returns true if CallSite \p CS is considered hot.
- bool isHotCallSite(const CallSite &CS, BlockFrequencyInfo *BFI);
- /// Returns true if Callsite \p CS is considered cold.
- bool isColdCallSite(const CallSite &CS, BlockFrequencyInfo *BFI);
+ bool isColdBlock(const BasicBlock *BB, BlockFrequencyInfo *BFI) const;
+ /// Returns true if BasicBlock \p BB is considered hot with regard to a given
+ /// hot percentile cutoff value.
+ bool isHotBlockNthPercentile(int PercentileCutoff, const BasicBlock *BB,
+ BlockFrequencyInfo *BFI) const;
+ /// Returns true if BasicBlock \p BB is considered cold with regard to a given
+ /// cold percentile cutoff value.
+ bool isColdBlockNthPercentile(int PercentileCutoff, const BasicBlock *BB,
+ BlockFrequencyInfo *BFI) const;
+ /// Returns true if the call site \p CB is considered hot.
+ bool isHotCallSite(const CallBase &CB, BlockFrequencyInfo *BFI) const;
+ /// Returns true if call site \p CB is considered cold.
+ bool isColdCallSite(const CallBase &CB, BlockFrequencyInfo *BFI) const;
/// Returns HotCountThreshold if set. Recompute HotCountThreshold
/// if not set.
- uint64_t getOrCompHotCountThreshold();
+ uint64_t getOrCompHotCountThreshold() const;
/// Returns ColdCountThreshold if set. Recompute HotCountThreshold
/// if not set.
- uint64_t getOrCompColdCountThreshold();
+ uint64_t getOrCompColdCountThreshold() const;
/// Returns HotCountThreshold if set.
- uint64_t getHotCountThreshold() {
+ uint64_t getHotCountThreshold() const {
return HotCountThreshold ? HotCountThreshold.getValue() : 0;
}
/// Returns ColdCountThreshold if set.
- uint64_t getColdCountThreshold() {
+ uint64_t getColdCountThreshold() const {
return ColdCountThreshold ? ColdCountThreshold.getValue() : 0;
}
+
+ private:
+ template <bool isHot>
+ bool isFunctionHotOrColdInCallGraphNthPercentile(
+ int PercentileCutoff, const Function *F, BlockFrequencyInfo &BFI) const;
+ template <bool isHot>
+ bool isHotOrColdCountNthPercentile(int PercentileCutoff, uint64_t C) const;
+ template <bool isHot>
+ bool isHotOrColdBlockNthPercentile(int PercentileCutoff,
+ const BasicBlock *BB,
+ BlockFrequencyInfo *BFI) const;
};
/// An analysis pass based on legacy pass manager to deliver ProfileSummaryInfo.