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 17namespace llvm { 18 19class Module; 20class ProfileSummaryInfo; 21class BlockFrequencyInfo; 22class TargetTransformInfo; 23class OptimizationRemarkEmitter; 24class AssumptionCache; 25class DominatorTree; 26class CodeExtractorAnalysisCache; 27 28/// A sequence of basic blocks. 29/// 30/// A 0-sized SmallVector is slightly cheaper to move than a std::vector. 31using BlockSequence = SmallVector<BasicBlock *, 0>; 32 33class HotColdSplitting { 34public: 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 43private: 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. 61class HotColdSplittingPass : public PassInfoMixin<HotColdSplittingPass> { 62public: 63 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); 64}; 65 66} // end namespace llvm 67 68#endif // LLVM_TRANSFORMS_IPO_HOTCOLDSPLITTING_H 69 70