summaryrefslogtreecommitdiffstats
path: root/llvm/include
diff options
context:
space:
mode:
authorEaswaran Raman <eraman@google.com>2016-03-01 18:30:58 +0000
committerEaswaran Raman <eraman@google.com>2016-03-01 18:30:58 +0000
commit7c4f25d2edc30ddb21754bdb772ab53904177ed2 (patch)
tree15ab4adcbf86de9c7c48ea1e47e60fd9cb998836 /llvm/include
parent2b36b15834e3589203b798c357ea032a35929d58 (diff)
downloadbcm5719-llvm-7c4f25d2edc30ddb21754bdb772ab53904177ed2.tar.gz
bcm5719-llvm-7c4f25d2edc30ddb21754bdb772ab53904177ed2.zip
Metadata support for profile summary.
This adds support to convert ProfileSummary object to Metadata and create a ProfileSummary object from metadata. This would allow attaching profile summary information to Module allowing optimization passes to use it. llvm-svn: 262360
Diffstat (limited to 'llvm/include')
-rw-r--r--llvm/include/llvm/ProfileData/ProfileCommon.h81
1 files changed, 64 insertions, 17 deletions
diff --git a/llvm/include/llvm/ProfileData/ProfileCommon.h b/llvm/include/llvm/ProfileData/ProfileCommon.h
index c0774d4b818..327af91ab2b 100644
--- a/llvm/include/llvm/ProfileData/ProfileCommon.h
+++ b/llvm/include/llvm/ProfileData/ProfileCommon.h
@@ -12,13 +12,15 @@
//
//===----------------------------------------------------------------------===//
+#ifndef LLVM_PROFILEDATA_PROFILE_COMMON_H
+#define LLVM_PROFILEDATA_PROFILE_COMMON_H
+
#include <cstdint>
#include <functional>
#include <map>
#include <vector>
-#ifndef LLVM_PROFILEDATA_PROFILE_COMMON_H
-#define LLVM_PROFILEDATA_PROFILE_COMMON_H
+#include "llvm/Support/Casting.h"
namespace llvm {
class Function;
@@ -29,8 +31,14 @@ namespace sampleprof {
class FunctionSamples;
}
struct InstrProfRecord;
+class LLVMContext;
+class Metadata;
+class MDTuple;
+class MDNode;
+
inline const char *getHotSectionPrefix() { return ".hot"; }
inline const char *getUnlikelySectionPrefix() { return ".unlikely"; }
+
// The profile summary is one or more (Cutoff, MinCount, NumCounts) triplets.
// The semantics of counts depend on the type of profile. For instrumentation
// profile, counts are block counts and for sample profile, counts are
@@ -46,37 +54,55 @@ struct ProfileSummaryEntry {
: Cutoff(TheCutoff), MinCount(TheMinCount), NumCounts(TheNumCounts) {}
};
+typedef std::vector<ProfileSummaryEntry> SummaryEntryVector;
+
class ProfileSummary {
+public:
+ enum Kind { PSK_Instr, PSK_Sample };
+
+private:
+ const Kind PSK;
+ const char *KindStr[2] = {"InstrProf", "SampleProfile"};
// We keep track of the number of times a count (block count or samples)
// appears in the profile. The map is kept sorted in the descending order of
// counts.
std::map<uint64_t, uint32_t, std::greater<uint64_t>> CountFrequencies;
-
protected:
- std::vector<ProfileSummaryEntry> DetailedSummary;
+ SummaryEntryVector DetailedSummary;
std::vector<uint32_t> DetailedSummaryCutoffs;
uint64_t TotalCount, MaxCount;
uint32_t NumCounts;
- ProfileSummary(std::vector<uint32_t> Cutoffs)
- : DetailedSummaryCutoffs(Cutoffs), TotalCount(0), MaxCount(0),
+ ProfileSummary(Kind K, std::vector<uint32_t> Cutoffs)
+ : PSK(K), DetailedSummaryCutoffs(Cutoffs), TotalCount(0), MaxCount(0),
NumCounts(0) {}
- ProfileSummary() : TotalCount(0), MaxCount(0), NumCounts(0) {}
- ProfileSummary(std::vector<ProfileSummaryEntry> DetailedSummary,
+ ProfileSummary(Kind K) : PSK(K), TotalCount(0), MaxCount(0), NumCounts(0) {}
+ ProfileSummary(Kind K, SummaryEntryVector DetailedSummary,
uint64_t TotalCount, uint64_t MaxCount, uint32_t NumCounts)
- : DetailedSummary(DetailedSummary), TotalCount(TotalCount),
+ : PSK(K), DetailedSummary(DetailedSummary), TotalCount(TotalCount),
MaxCount(MaxCount), NumCounts(NumCounts) {}
inline void addCount(uint64_t Count);
+ /// \brief Return metadata specific to the profile format.
+ /// Derived classes implement this method to return a vector of Metadata.
+ virtual std::vector<Metadata *> getFormatSpecificMD(LLVMContext &Context) = 0;
+ /// \brief Return detailed summary as metadata.
+ Metadata *getDetailedSummaryMD(LLVMContext &Context);
public:
static const int Scale = 1000000;
+ Kind getKind() const { return PSK; }
+ const char *getKindStr() const { return KindStr[PSK]; }
// \brief Returns true if F is a hot function.
static bool isFunctionHot(const Function *F);
// \brief Returns true if F is unlikley executed.
static bool isFunctionUnlikely(const Function *F);
- inline std::vector<ProfileSummaryEntry> &getDetailedSummary();
+ inline SummaryEntryVector &getDetailedSummary();
void computeDetailedSummary();
/// \brief A vector of useful cutoff values for detailed summary.
static const std::vector<uint32_t> DefaultCutoffs;
+ /// \brief Return summary information as metadata.
+ Metadata *getMD(LLVMContext &Context);
+ /// \brief Construct profile summary from metdata.
+ static ProfileSummary *getFromMD(Metadata *MD);
};
class InstrProfSummary : public ProfileSummary {
@@ -85,11 +111,25 @@ class InstrProfSummary : public ProfileSummary {
inline void addEntryCount(uint64_t Count);
inline void addInternalCount(uint64_t Count);
+protected:
+ std::vector<Metadata *> getFormatSpecificMD(LLVMContext &Context);
+
public:
InstrProfSummary(std::vector<uint32_t> Cutoffs)
- : ProfileSummary(Cutoffs), MaxInternalBlockCount(0), MaxFunctionCount(0),
- NumFunctions(0) {}
+ : ProfileSummary(PSK_Instr, Cutoffs), MaxInternalBlockCount(0),
+ MaxFunctionCount(0), NumFunctions(0) {}
InstrProfSummary(const IndexedInstrProf::Summary &S);
+ InstrProfSummary(uint64_t TotalCount, uint64_t MaxBlockCount,
+ uint64_t MaxInternalBlockCount, uint64_t MaxFunctionCount,
+ uint32_t NumBlocks, uint32_t NumFunctions,
+ SummaryEntryVector Summary)
+ : ProfileSummary(PSK_Instr, Summary, TotalCount, MaxBlockCount,
+ NumBlocks),
+ MaxInternalBlockCount(MaxInternalBlockCount),
+ MaxFunctionCount(MaxFunctionCount), NumFunctions(NumFunctions) {}
+ static bool classof(const ProfileSummary *PS) {
+ return PS->getKind() == PSK_Instr;
+ }
void addRecord(const InstrProfRecord &);
uint32_t getNumBlocks() { return NumCounts; }
uint64_t getTotalCount() { return TotalCount; }
@@ -103,6 +143,9 @@ class SampleProfileSummary : public ProfileSummary {
uint64_t MaxHeadSamples;
uint32_t NumFunctions;
+protected:
+ std::vector<Metadata *> getFormatSpecificMD(LLVMContext &Context);
+
public:
uint32_t getNumLinesWithSamples() { return NumCounts; }
uint64_t getTotalSamples() { return TotalCount; }
@@ -111,14 +154,18 @@ public:
uint64_t getMaxSamplesPerLine() { return MaxCount; }
void addRecord(const sampleprof::FunctionSamples &FS);
SampleProfileSummary(std::vector<uint32_t> Cutoffs)
- : ProfileSummary(Cutoffs), MaxHeadSamples(0), NumFunctions(0) {}
+ : ProfileSummary(PSK_Sample, Cutoffs), MaxHeadSamples(0),
+ NumFunctions(0) {}
SampleProfileSummary(uint64_t TotalSamples, uint64_t MaxSamplesPerLine,
uint64_t MaxHeadSamples, int32_t NumLinesWithSamples,
uint32_t NumFunctions,
- std::vector<ProfileSummaryEntry> DetailedSummary)
- : ProfileSummary(DetailedSummary, TotalSamples, MaxSamplesPerLine,
- NumLinesWithSamples),
+ SummaryEntryVector DetailedSummary)
+ : ProfileSummary(PSK_Sample, DetailedSummary, TotalSamples,
+ MaxSamplesPerLine, NumLinesWithSamples),
MaxHeadSamples(MaxHeadSamples), NumFunctions(NumFunctions) {}
+ static bool classof(const ProfileSummary *PS) {
+ return PS->getKind() == PSK_Sample;
+ }
};
// This is called when a count is seen in the profile.
@@ -130,7 +177,7 @@ void ProfileSummary::addCount(uint64_t Count) {
CountFrequencies[Count]++;
}
-std::vector<ProfileSummaryEntry> &ProfileSummary::getDetailedSummary() {
+SummaryEntryVector &ProfileSummary::getDetailedSummary() {
if (!DetailedSummaryCutoffs.empty() && DetailedSummary.empty())
computeDetailedSummary();
return DetailedSummary;
OpenPOWER on IntegriCloud