//===- 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