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