diff options
| author | Easwaran Raman <eraman@google.com> | 2016-03-01 18:30:58 +0000 |
|---|---|---|
| committer | Easwaran Raman <eraman@google.com> | 2016-03-01 18:30:58 +0000 |
| commit | 7c4f25d2edc30ddb21754bdb772ab53904177ed2 (patch) | |
| tree | 15ab4adcbf86de9c7c48ea1e47e60fd9cb998836 /llvm/include | |
| parent | 2b36b15834e3589203b798c357ea032a35929d58 (diff) | |
| download | bcm5719-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.h | 81 |
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; |

