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