]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/llvm/include/llvm/Transforms/IPO/HotColdSplitting.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm-project / llvm / include / llvm / Transforms / IPO / HotColdSplitting.h
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