1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- 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
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|