Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===- ProfileSummary.h - Profile summary data structure. -------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file defines the profile summary data structure.
  10. //
  11. //===----------------------------------------------------------------------===//
  12.  
  13. #ifndef LLVM_IR_PROFILESUMMARY_H
  14. #define LLVM_IR_PROFILESUMMARY_H
  15.  
  16. #include <algorithm>
  17. #include <cassert>
  18. #include <cstdint>
  19. #include <vector>
  20.  
  21. namespace llvm {
  22.  
  23. class LLVMContext;
  24. class Metadata;
  25. class raw_ostream;
  26.  
  27. // The profile summary is one or more (Cutoff, MinCount, NumCounts) triplets.
  28. // The semantics of counts depend on the type of profile. For instrumentation
  29. // profile, counts are block counts and for sample profile, counts are
  30. // per-line samples. Given a target counts percentile, we compute the minimum
  31. // number of counts needed to reach this target and the minimum among these
  32. // counts.
  33. struct ProfileSummaryEntry {
  34.   const uint32_t Cutoff;    ///< The required percentile of counts.
  35.   const uint64_t MinCount;  ///< The minimum count for this percentile.
  36.   const uint64_t NumCounts; ///< Number of counts >= the minimum count.
  37.  
  38.   ProfileSummaryEntry(uint32_t TheCutoff, uint64_t TheMinCount,
  39.                       uint64_t TheNumCounts)
  40.       : Cutoff(TheCutoff), MinCount(TheMinCount), NumCounts(TheNumCounts) {}
  41. };
  42.  
  43. using SummaryEntryVector = std::vector<ProfileSummaryEntry>;
  44.  
  45. class ProfileSummary {
  46. public:
  47.   enum Kind { PSK_Instr, PSK_CSInstr, PSK_Sample };
  48.  
  49. private:
  50.   const Kind PSK;
  51.   const SummaryEntryVector DetailedSummary;
  52.   const uint64_t TotalCount, MaxCount, MaxInternalCount, MaxFunctionCount;
  53.   const uint32_t NumCounts, NumFunctions;
  54.   /// If 'Partial' is false, it means the profile being used to optimize
  55.   /// a target is collected from the same target.
  56.   /// If 'Partial' is true, it means the profile is for common/shared
  57.   /// code. The common profile is usually merged from profiles collected
  58.   /// from running other targets.
  59.   bool Partial = false;
  60.   /// This approximately represents the ratio of the number of profile counters
  61.   /// of the program being built to the number of profile counters in the
  62.   /// partial sample profile. When 'Partial' is false, it is undefined. This is
  63.   /// currently only available under thin LTO mode.
  64.   double PartialProfileRatio = 0.0;
  65.   /// Return detailed summary as metadata.
  66.   Metadata *getDetailedSummaryMD(LLVMContext &Context);
  67.  
  68. public:
  69.   static const int Scale = 1000000;
  70.  
  71.   ProfileSummary(Kind K, const SummaryEntryVector &DetailedSummary,
  72.                  uint64_t TotalCount, uint64_t MaxCount,
  73.                  uint64_t MaxInternalCount, uint64_t MaxFunctionCount,
  74.                  uint32_t NumCounts, uint32_t NumFunctions,
  75.                  bool Partial = false, double PartialProfileRatio = 0)
  76.       : PSK(K), DetailedSummary(std::move(DetailedSummary)),
  77.         TotalCount(TotalCount), MaxCount(MaxCount),
  78.         MaxInternalCount(MaxInternalCount), MaxFunctionCount(MaxFunctionCount),
  79.         NumCounts(NumCounts), NumFunctions(NumFunctions), Partial(Partial),
  80.         PartialProfileRatio(PartialProfileRatio) {}
  81.  
  82.   Kind getKind() const { return PSK; }
  83.   /// Return summary information as metadata.
  84.   Metadata *getMD(LLVMContext &Context, bool AddPartialField = true,
  85.                   bool AddPartialProfileRatioField = true);
  86.   /// Construct profile summary from metdata.
  87.   static ProfileSummary *getFromMD(Metadata *MD);
  88.   const SummaryEntryVector &getDetailedSummary() { return DetailedSummary; }
  89.   uint32_t getNumFunctions() const { return NumFunctions; }
  90.   uint64_t getMaxFunctionCount() const { return MaxFunctionCount; }
  91.   uint32_t getNumCounts() const { return NumCounts; }
  92.   uint64_t getTotalCount() const { return TotalCount; }
  93.   uint64_t getMaxCount() const { return MaxCount; }
  94.   uint64_t getMaxInternalCount() const { return MaxInternalCount; }
  95.   void setPartialProfile(bool PP) { Partial = PP; }
  96.   bool isPartialProfile() const { return Partial; }
  97.   double getPartialProfileRatio() const { return PartialProfileRatio; }
  98.   void setPartialProfileRatio(double R) {
  99.     assert(isPartialProfile() && "Unexpected when not partial profile");
  100.     PartialProfileRatio = R;
  101.   }
  102.   void printSummary(raw_ostream &OS) const;
  103.   void printDetailedSummary(raw_ostream &OS) const;
  104. };
  105.  
  106. } // end namespace llvm
  107.  
  108. #endif // LLVM_IR_PROFILESUMMARY_H
  109.