| //===- HotColdSplitting.h ---- Outline Cold Regions -------------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| //===----------------------------------------------------------------------===// |
| // |
| // This pass outlines cold regions to a separate function. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_TRANSFORMS_IPO_HOTCOLDSPLITTING_H |
| #define LLVM_TRANSFORMS_IPO_HOTCOLDSPLITTING_H |
| |
| #include "llvm/IR/PassManager.h" |
| |
| namespace llvm { |
| |
| class Module; |
| class ProfileSummaryInfo; |
| class BlockFrequencyInfo; |
| class TargetTransformInfo; |
| class OptimizationRemarkEmitter; |
| class AssumptionCache; |
| class DominatorTree; |
| class CodeExtractorAnalysisCache; |
| |
| /// A sequence of basic blocks. |
| /// |
| /// A 0-sized SmallVector is slightly cheaper to move than a std::vector. |
| using BlockSequence = SmallVector<BasicBlock *, 0>; |
| |
| class HotColdSplitting { |
| public: |
| HotColdSplitting(ProfileSummaryInfo *ProfSI, |
| function_ref<BlockFrequencyInfo *(Function &)> GBFI, |
| function_ref<TargetTransformInfo &(Function &)> GTTI, |
| std::function<OptimizationRemarkEmitter &(Function &)> *GORE, |
| function_ref<AssumptionCache *(Function &)> LAC) |
| : PSI(ProfSI), GetBFI(GBFI), GetTTI(GTTI), GetORE(GORE), LookupAC(LAC) {} |
| bool run(Module &M); |
| |
| private: |
| bool isFunctionCold(const Function &F) const; |
| bool shouldOutlineFrom(const Function &F) const; |
| bool outlineColdRegions(Function &F, bool HasProfileSummary); |
| Function *extractColdRegion(const BlockSequence &Region, |
| const CodeExtractorAnalysisCache &CEAC, |
| DominatorTree &DT, BlockFrequencyInfo *BFI, |
| TargetTransformInfo &TTI, |
| OptimizationRemarkEmitter &ORE, |
| AssumptionCache *AC, unsigned Count); |
| ProfileSummaryInfo *PSI; |
| function_ref<BlockFrequencyInfo *(Function &)> GetBFI; |
| function_ref<TargetTransformInfo &(Function &)> GetTTI; |
| std::function<OptimizationRemarkEmitter &(Function &)> *GetORE; |
| function_ref<AssumptionCache *(Function &)> LookupAC; |
| }; |
| |
| /// Pass to outline cold regions. |
| class HotColdSplittingPass : public PassInfoMixin<HotColdSplittingPass> { |
| public: |
| PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); |
| }; |
| |
| } // end namespace llvm |
| |
| #endif // LLVM_TRANSFORMS_IPO_HOTCOLDSPLITTING_H |
| |