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: HotColdSplitting(ProfileSummaryInfo * ProfSI,function_ref<BlockFrequencyInfo * (Function &)> GBFI,function_ref<TargetTransformInfo & (Function &)> GTTI,std::function<OptimizationRemarkEmitter & (Function &)> * GORE,function_ref<AssumptionCache * (Function &)> LAC)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