Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

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

  1. //===- HotColdSplitting.h ---- Outline Cold Regions -------------*- 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. // This pass outlines cold regions to a separate function.
  9. //
  10. //===----------------------------------------------------------------------===//
  11.  
  12. #ifndef LLVM_TRANSFORMS_IPO_HOTCOLDSPLITTING_H
  13. #define LLVM_TRANSFORMS_IPO_HOTCOLDSPLITTING_H
  14.  
  15. #include "llvm/IR/PassManager.h"
  16.  
  17. namespace llvm {
  18.  
  19. class Module;
  20. class ProfileSummaryInfo;
  21. class BlockFrequencyInfo;
  22. class TargetTransformInfo;
  23. class OptimizationRemarkEmitter;
  24. class AssumptionCache;
  25. class DominatorTree;
  26. class CodeExtractorAnalysisCache;
  27.  
  28. /// A sequence of basic blocks.
  29. ///
  30. /// A 0-sized SmallVector is slightly cheaper to move than a std::vector.
  31. using BlockSequence = SmallVector<BasicBlock *, 0>;
  32.  
  33. class HotColdSplitting {
  34. public:
  35.   HotColdSplitting(ProfileSummaryInfo *ProfSI,
  36.                    function_ref<BlockFrequencyInfo *(Function &)> GBFI,
  37.                    function_ref<TargetTransformInfo &(Function &)> GTTI,
  38.                    std::function<OptimizationRemarkEmitter &(Function &)> *GORE,
  39.                    function_ref<AssumptionCache *(Function &)> LAC)
  40.       : PSI(ProfSI), GetBFI(GBFI), GetTTI(GTTI), GetORE(GORE), LookupAC(LAC) {}
  41.   bool run(Module &M);
  42.  
  43. private:
  44.   bool isFunctionCold(const Function &F) const;
  45.   bool shouldOutlineFrom(const Function &F) const;
  46.   bool outlineColdRegions(Function &F, bool HasProfileSummary);
  47.   Function *extractColdRegion(const BlockSequence &Region,
  48.                               const CodeExtractorAnalysisCache &CEAC,
  49.                               DominatorTree &DT, BlockFrequencyInfo *BFI,
  50.                               TargetTransformInfo &TTI,
  51.                               OptimizationRemarkEmitter &ORE,
  52.                               AssumptionCache *AC, unsigned Count);
  53.   ProfileSummaryInfo *PSI;
  54.   function_ref<BlockFrequencyInfo *(Function &)> GetBFI;
  55.   function_ref<TargetTransformInfo &(Function &)> GetTTI;
  56.   std::function<OptimizationRemarkEmitter &(Function &)> *GetORE;
  57.   function_ref<AssumptionCache *(Function &)> LookupAC;
  58. };
  59.  
  60. /// Pass to outline cold regions.
  61. class HotColdSplittingPass : public PassInfoMixin<HotColdSplittingPass> {
  62. public:
  63.   PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
  64. };
  65.  
  66. } // end namespace llvm
  67.  
  68. #endif // LLVM_TRANSFORMS_IPO_HOTCOLDSPLITTING_H
  69.  
  70.