14#ifndef LLVM_PASSES_CODEGENPASSBUILDER_H
15#define LLVM_PASSES_CODEGENPASSBUILDER_H
134#define DUMMY_FUNCTION_PASS(NAME, PASS_NAME) \
135 struct PASS_NAME : public OptionalPassInfoMixin<PASS_NAME> { \
136 template <typename... Ts> PASS_NAME(Ts &&...) {} \
137 PreservedAnalyses run(Function &, FunctionAnalysisManager &) { \
138 return PreservedAnalyses::all(); \
141#define DUMMY_MACHINE_MODULE_PASS(NAME, PASS_NAME) \
142 struct PASS_NAME : public OptionalPassInfoMixin<PASS_NAME> { \
143 template <typename... Ts> PASS_NAME(Ts &&...) {} \
144 PreservedAnalyses run(Module &, ModuleAnalysisManager &) { \
145 return PreservedAnalyses::all(); \
148#define DUMMY_MACHINE_FUNCTION_PASS(NAME, PASS_NAME) \
149 struct PASS_NAME : public OptionalPassInfoMixin<PASS_NAME> { \
150 template <typename... Ts> PASS_NAME(Ts &&...) {} \
151 PreservedAnalyses run(MachineFunction &, \
152 MachineFunctionAnalysisManager &) { \
153 return PreservedAnalyses::all(); \
156#include "llvm/Passes/MachinePassRegistry.def"
158class PassManagerWrapper {
166 template <
typename DerivedT,
typename TargetMachineT>
187 if (
Opt.EnableIPRA) {
188 TM.Options.EnableIPRA = *Opt.EnableIPRA;
191 TM.Options.EnableIPRA |= TM.useIPRA();
194 if (
Opt.EnableGlobalISelAbort)
195 TM.Options.GlobalISelAbort = *
Opt.EnableGlobalISelAbort;
200 bool Optimized = Opt.RegAlloc > RegAllocType::Default
201 ? Opt.RegAlloc != RegAllocType::Fast
202 : getOptLevel() != CodeGenOptLevel::None;
203 Opt.OptimizeRegAlloc = Optimized ? cl::boolOrDefault::BOU_TRUE
204 : cl::boolOrDefault::BOU_FALSE;
217 template <
typename PassT>
219 std::declval<Module &>(), std::declval<ModuleAnalysisManager &>()));
221 template <
typename PassT>
223 std::declval<Function &>(), std::declval<FunctionAnalysisManager &>()));
225 template <
typename PassT>
227 std::declval<MachineFunction &>(),
228 std::declval<MachineFunctionAnalysisManager &>()));
230 template <
typename PassT>
235 "Only function passes are supported.");
236 if (!Force && !runBeforeAdding(Name))
241 template <
typename PassT>
245 "Only module passes are suported.");
247 "You cannot insert a module pass without first flushing the current "
248 "function pipelines to the module pipeline.");
249 if (!Force && !runBeforeAdding(Name))
254 template <
typename PassT>
259 "Only machine function passes are supported.");
261 if (!Force && !runBeforeAdding(Name))
264 for (
auto &
C : AfterCallbacks)
269 bool FreeMachineFunctions =
false)
const {
277 if (FreeMachineFunctions)
279 if (AddInCGSCCOrder) {
291 "Requiring CGSCC ordering requires flushing the current function "
292 "pipelines to the MPM.");
293 AddInCGSCCOrder =
true;
299 "Stopping CGSCC ordering requires flushing the current function "
300 "pipelines to the MPM.");
301 AddInCGSCCOrder =
false;
308 template <
typename TMC> TMC &
getTM()
const {
return static_cast<TMC &
>(
TM); }
431 "addGlobalInstructionSelect is not overridden",
516 bool Optimized)
const;
531 BeforeCallbacks.emplace_back(
532 [](
StringRef Name) {
return ((Name != PassTs::name()) && ...); });
537 template <
typename TargetPassT,
typename InsertedPassT>
539 AfterCallbacks.emplace_back(
541 if (Name == TargetPassT::name() &&
542 runBeforeAdding(InsertedPassT::name())) {
549 DerivedT &derived() {
return static_cast<DerivedT &
>(*this); }
550 const DerivedT &derived()
const {
551 return static_cast<const DerivedT &
>(*this);
554 bool runBeforeAdding(StringRef Name)
const {
555 bool ShouldAdd =
true;
556 for (
auto &
C : BeforeCallbacks)
557 ShouldAdd &=
C(Name);
561 void setStartStopPasses(
const TargetPassConfig::StartStopInfo &Info)
const;
563 Error verifyStartStop(
const TargetPassConfig::StartStopInfo &Info)
const;
565 mutable SmallVector<llvm::unique_function<bool(StringRef)>, 4>
572 mutable bool Started =
true;
573 mutable bool Stopped =
true;
574 mutable bool AddInCGSCCOrder =
false;
577template <
typename Derived,
typename TargetMachineT>
583 return StartStopInfo.takeError();
584 setStartStopPasses(*StartStopInfo);
607 TM.createMCStreamer(Out, DwoOut, FileType, Ctx);
608 if (!MCStreamerOrErr)
610 std::unique_ptr<AsmPrinter>
Printer(
611 TM.getTarget().createAsmPrinter(
TM, std::move(*MCStreamerOrErr)));
615 derived().addAsmPrinterBegin(PMW);
622 return std::move(Err);
625 return std::move(Err);
627 if (!
Opt.DisableVerify &&
TM.Options.EnableDefaultMachineVerifier)
633 derived().addAsmPrinter(PMW);
637 derived().addAsmPrinterEnd(PMW);
644 return verifyStartStop(*StartStopInfo);
647template <
typename Derived,
typename TargetMachineT>
648void CodeGenPassBuilder<Derived, TargetMachineT>::setStartStopPasses(
650 if (!Info.StartPass.empty()) {
652 BeforeCallbacks.emplace_back([
this, &Info, AfterFlag = Info.StartAfter,
654 if (Count == Info.StartInstanceNum) {
662 auto PassName =
PIC->getPassNameForClassName(ClassName);
664 Started = !Info.StartAfter;
670 if (!
Info.StopPass.empty()) {
672 BeforeCallbacks.emplace_back([
this, &Info, AfterFlag =
Info.StopAfter,
674 if (Count == Info.StopInstanceNum) {
684 Stopped = !
Info.StopAfter;
690template <
typename Derived,
typename TargetMachineT>
691Error CodeGenPassBuilder<Derived, TargetMachineT>::verifyStartStop(
693 if (Started && Stopped)
698 "Can't find start pass \"" + Info.StartPass +
"\".",
699 std::make_error_code(std::errc::invalid_argument));
702 "Can't find stop pass \"" + Info.StopPass +
"\".",
703 std::make_error_code(std::errc::invalid_argument));
707template <
typename Derived,
typename TargetMachineT>
710 derived().addGlobalMergePass(PMW);
711 if (
TM.useEmulatedTLS())
723 derived().addIRPasses(PMW);
724 derived().addCodeGenPrepare(PMW);
726 derived().addISelPrepare(PMW);
731template <
typename Derived,
typename TargetMachineT>
736 if (!
Opt.DisableVerify)
745 if (
Opt.EnableLoopTermFold)
775 !
Opt.DisablePartialLibcallInlining)
787 if (!
Opt.DisableExpandReductions)
794 if (
Opt.EnableGlobalMergeFunc) {
802template <
typename Derived,
typename TargetMachineT>
848template <
typename Derived,
typename TargetMachineT>
859template <
typename Derived,
typename TargetMachineT>
862 derived().addPreISel(PMW);
864 if (
Opt.RequiresCodeGenSCCOrder && !AddInCGSCCOrder)
873 if (
Opt.PrintISelInput)
875 dbgs(),
"\n\n*** Final LLVM Code input to ISel ***\n"),
880 if (!
Opt.DisableVerify)
884template <
typename Derived,
typename TargetMachineT>
888 TM.setO0WantsFastISel(
Opt.EnableFastISelOption !=
893 SelectorType Selector;
896 Selector = SelectorType::FastISel;
898 (
TM.Options.EnableGlobalISel &&
900 Selector = SelectorType::GlobalISel;
902 Selector = SelectorType::FastISel;
904 Selector = SelectorType::SelectionDAG;
907 if (Selector == SelectorType::FastISel) {
908 TM.setFastISel(
true);
909 TM.setGlobalISel(
false);
910 }
else if (Selector == SelectorType::GlobalISel) {
911 TM.setFastISel(
false);
912 TM.setGlobalISel(
true);
916 if (Selector == SelectorType::GlobalISel) {
918 return std::move(Err);
920 derived().addPreLegalizeMachineIR(PMW);
923 return std::move(Err);
927 derived().addPreRegBankSelect(PMW);
930 return std::move(Err);
932 derived().addPreGlobalInstructionSelect(PMW);
935 return std::move(Err);
947 return std::move(Err);
950 return std::move(Err);
978template <
typename Derived,
typename TargetMachineT>
983 derived().addMachineSSAOptimization(PMW);
990 if (
TM.Options.EnableIPRA) {
997 derived().addPreRegAlloc(PMW);
1004 return std::move(Err);
1007 derived().addPostRegAlloc(PMW);
1022 derived().addMachineLateOptimization(PMW);
1028 derived().addPreSched2(PMW);
1030 if (
Opt.EnableImplicitNullChecks)
1037 !
TM.targetSchedulesPostRAScheduling()) {
1038 if (
Opt.MISchedPostRA)
1045 derived().addGCPasses(PMW);
1049 derived().addBlockPlacement(PMW);
1057 derived().addPreEmitPass(PMW);
1059 if (
TM.Options.EnableIPRA) {
1064 if (
Opt.PrintRegUsage) {
1080 if (
TM.Options.EnableMachineOutliner &&
1084 TM.Options.SupportsDefaultOutlining) {
1090 if (
Opt.EnableGCEmptyBlocks)
1093 derived().addPostBBSections(PMW);
1098 derived().addPreEmitPass2(PMW);
1104template <
typename Derived,
typename TargetMachineT>
1131 derived().addILPOpts(PMW);
1158template <
typename Derived,
typename TargetMachineT>
1173template <
typename Derived,
typename TargetMachineT>
1178 switch (
Opt.RegAlloc) {
1192 derived().addTargetRegisterAllocator(PMW, Optimized);
1195template <
typename Derived,
typename TargetMachineT>
1203template <
typename Derived,
typename TargetMachineT>
1211 derived().addPreRewrite(PMW);
1221template <
typename Derived,
typename TargetMachineT>
1226 return derived().addRegAssignAndRewriteFast(PMW);
1232template <
typename Derived,
typename TargetMachineT>
1261 if (
Opt.EarlyLiveIntervals)
1276 Expected<bool> AddedPasses = derived().addRegAssignAndRewriteOptimized(PMW);
1279 if (!AddedPasses.
get())
1286 derived().addPostRewrite(PMW);
1305template <
typename Derived,
typename TargetMachineT>
1318 if (!
TM.requiresStructuredCFG())
1326template <
typename Derived,
typename TargetMachineT>
1331 if (
Opt.EnableBlockPlacementStats)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
amdgpu next use AMDGPU Next Use Analysis Printer
This is the interface for LLVM's primary stateless and local alias analysis.
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
This header provides classes for managing passes over SCCs of the call graph.
Defines an IR pass for CodeGen Prepare.
Analysis that tracks defined/used subregister lanes across COPY instructions and instructions that ge...
This file defines passes to print out IR in various granularities.
This header defines various interfaces for pass management in LLVM.
This file contains the declaration of the InterleavedAccessPass class, its corresponding pass name is...
This header provides classes for managing a pipeline of passes over loops in LLVM IR.
The header file for the LowerConstantIntrinsics pass as used by the new pass manager.
ModuleAnalysisManager MAM
PassInstrumentationCallbacks PIC
This pass is required to take advantage of the interprocedural register allocation infrastructure.
This is the interface for a metadata-based scoped no-alias analysis.
This file contains the declaration of the SelectOptimizePass class, its corresponding pass name is se...
This file defines the SmallVector class.
Target-Independent Code Generator Pass Configuration Options pass.
This is the interface for a metadata-based TBAA.
static const char PassName[]
A pass that canonicalizes freeze instructions in a loop.
void addPostRegAlloc(PassManagerWrapper &PMW) const
This method may be implemented by targets that want to run passes after register allocation pass pipe...
void addGlobalMergePass(PassManagerWrapper &PMW) const
Target can override this to add GlobalMergePass before all IR passes.
Error addOptimizedRegAlloc(PassManagerWrapper &PMW) const
addOptimizedRegAlloc - Add passes related to register allocation.
void addModulePass(PassT &&Pass, PassManagerWrapper &PMW, bool Force=false, StringRef Name=PassT::name()) const
decltype(std::declval< PassT & >().run( std::declval< Function & >(), std::declval< FunctionAnalysisManager & >())) is_function_pass_t
void flushFPMsToMPM(PassManagerWrapper &PMW, bool FreeMachineFunctions=false) const
void addPreGlobalInstructionSelect(PassManagerWrapper &PMW) const
This method may be implemented by targets that want to run passes immediately before the (global) ins...
void requireCGSCCOrder(PassManagerWrapper &PMW) const
void addISelPrepare(PassManagerWrapper &PMW) const
Add common passes that perform LLVM IR to IR transforms in preparation for instruction selection.
void addTargetRegisterAllocator(PassManagerWrapper &PMW, bool Optimized) const
Utilities for targets to add passes to the pass manager.
bool isGlobalISelAbortEnabled() const
Check whether or not GlobalISel should abort on error.
Error addMachinePasses(PassManagerWrapper &PMW) const
Add the complete, standard set of LLVM CodeGen passes.
void insertPass(InsertedPassT &&Pass) const
Insert InsertedPass pass after TargetPass pass.
void addPreRewrite(PassManagerWrapper &PMW) const
addPreRewrite - Add passes to the optimized register allocation pipeline after register allocation is...
Error addFastRegAlloc(PassManagerWrapper &PMW) const
addFastRegAlloc - Add the minimum set of target-independent passes that are required for fast registe...
Error buildPipeline(ModulePassManager &MPM, ModuleAnalysisManager &MAM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut, CodeGenFileType FileType, MCContext &Ctx) const
void addPreISel(PassManagerWrapper &PMW) const
{{@ For GlobalISel
Error addCoreISelPasses(PassManagerWrapper &PMW) const
Add the actual instruction selection passes.
void stopAddingInCGSCCOrder(PassManagerWrapper &PMW) const
void addPreLegalizeMachineIR(PassManagerWrapper &PMW) const
This method may be implemented by targets that want to run passes immediately before legalization.
void addCodeGenPrepare(PassManagerWrapper &PMW) const
Add pass to prepare the LLVM IR for code generation.
void addPreEmitPass(PassManagerWrapper &PMW) const
This pass may be implemented by targets that want to run passes immediately before machine code is em...
void addMachineSSAOptimization(PassManagerWrapper &PMW) const
Methods with trivial inline returns are convenient points in the common codegen pass pipeline where t...
void addIRPasses(PassManagerWrapper &PMW) const
Add common target configurable passes that perform LLVM IR to IR transforms following machine indepen...
decltype(std::declval< PassT & >().run( std::declval< MachineFunction & >(), std::declval< MachineFunctionAnalysisManager & >())) is_machine_function_pass_t
Expected< bool > addRegAssignAndRewriteOptimized(PassManagerWrapper &PMW) const
void addMachineLateOptimization(PassManagerWrapper &PMW) const
Add passes that optimize machine instructions after register allocation.
Error addLegalizeMachineIR(PassManagerWrapper &PMW) const
This method should install a legalize pass, which converts the instruction sequence into one that can...
PassInstrumentationCallbacks * PIC
CodeGenPassBuilder(TargetMachineT &TM, const CGPassBuilderOption &Opts, PassInstrumentationCallbacks *PIC)
void addPreEmitPass2(PassManagerWrapper &PMW) const
Targets may add passes immediately before machine code is emitted in this callback.
Error addIRTranslator(PassManagerWrapper &PMW) const
This method should install an IR translator pass, which converts from LLVM code to machine instructio...
void addGCPasses(PassManagerWrapper &PMW) const
addGCPasses - Add late codegen passes that analyze code for garbage collection.
void addRegAllocPass(PassManagerWrapper &PMW, bool Optimized) const
addMachinePasses helper to create the target-selected or overriden regalloc pass.
Error addRegBankSelect(PassManagerWrapper &PMW) const
This method should install a register bank selector pass, which assigns register banks to virtual reg...
void addMachineFunctionPass(PassT &&Pass, PassManagerWrapper &PMW, bool Force=false, StringRef Name=PassT::name()) const
void addISelPasses(PassManagerWrapper &PMW) const
High level function that adds all passes necessary to go from llvm IR representation to the MI repres...
void disablePass()
Allow the target to disable a specific pass by default.
Error addInstSelector(PassManagerWrapper &PMW) const
addInstSelector - This method should install an instruction selector pass, which converts from LLVM c...
void addPreRegAlloc(PassManagerWrapper &PMW) const
This method may be implemented by targets that want to run passes immediately before register allocat...
void addPassesToHandleExceptions(PassManagerWrapper &PMW) const
Add passes to lower exception handling for the code generator.
void addBlockPlacement(PassManagerWrapper &PMW) const
Add standard basic block placement passes.
void addAsmPrinterEnd(PassManagerWrapper &PMW) const
void addPreRegBankSelect(PassManagerWrapper &PMW) const
This method may be implemented by targets that want to run passes immediately before the register ban...
void addPreSched2(PassManagerWrapper &PMW) const
This method may be implemented by targets that want to run passes after prolog-epilog insertion and b...
Error addGlobalInstructionSelect(PassManagerWrapper &PMWM) const
This method should install a (global) instruction selector pass, which converts possibly generic inst...
void addAsmPrinterBegin(PassManagerWrapper &PMW) const
void addFunctionPass(PassT &&Pass, PassManagerWrapper &PMW, bool Force=false, StringRef Name=PassT::name()) const
void addILPOpts(PassManagerWrapper &PMW) const
Add passes that optimize instruction level parallelism for out-of-order targets.
Error addRegAssignAndRewriteFast(PassManagerWrapper &PMW) const
Add core register allocator passes which do the actual register assignment and rewriting.
decltype(std::declval< PassT & >().run( std::declval< Module & >(), std::declval< ModuleAnalysisManager & >())) is_module_pass_t
void addPostBBSections(PassManagerWrapper &PMW) const
void addPostRewrite(PassManagerWrapper &PMW) const
Add passes to be run immediately after virtual registers are rewritten to physical registers.
void addAsmPrinter(PassManagerWrapper &PMW) const
CodeGenOptLevel getOptLevel() const
PassInstrumentationCallbacks * getPassInstrumentationCallbacks() const
bool reportDiagnosticWhenGlobalISelFallback() const
Check whether or not a diagnostic should be emitted when GlobalISel uses the fallback path.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
reference get()
Returns a reference to the stored T value.
This is a fast-path instruction selection class that generates poor code and doesn't support illegal ...
LowerIntrinsics - This pass rewrites calls to the llvm.gcread or llvm.gcwrite intrinsics,...
Performs Loop Strength Reduce Pass.
This class is intended to be used as a base class for asm properties and features specific to the tar...
ExceptionHandling getExceptionHandlingType() const
Context object for machine code objects.
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
LLVM_ABI StringRef getPassNameForClassName(StringRef ClassName)
Get the pass name for a given pass class name. Empty if no match found.
friend class CodeGenPassBuilder
LLVM_ATTRIBUTE_MINSIZE std::enable_if_t<!std::is_same_v< PassT, PassManager > > addPass(PassT &&Pass)
bool isEmpty() const
Returns if the pass manager contains any passes.
Pass interface - Implemented by all 'passes'.
Pass (for the new pass manager) for printing a Function as LLVM's text IR assembly.
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
Represent a constant reference to a string, i.e.
static Expected< StartStopInfo > getStartStopInfo(PassInstrumentationCallbacks &PIC)
Returns pass name in -stop-before or -stop-after NOTE: New pass manager migration only.
static bool willCompleteCodeGenPipeline()
Returns true if none of the -stop-before and -stop-after options is set.
An abstract base class for streams implementations that also support a pwrite operation.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is an optimization pass for GlobalISel generic memory operations.
ModuleToFunctionPassAdaptor createModuleToFunctionPassAdaptor(FunctionPassT &&Pass, bool EagerlyInvalidate=false)
A function to deduce a function pass type and wrap it in the templated adaptor.
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
PassManager< Loop, LoopAnalysisManager, LoopStandardAnalysisResults &, LPMUpdater & > LoopPassManager
The Loop pass manager.
ModuleToPostOrderCGSCCPassAdaptor createModuleToPostOrderCGSCCPassAdaptor(CGSCCPassT &&Pass)
A function to deduce a function pass type and wrap it in the templated adaptor.
FunctionToLoopPassAdaptor createFunctionToLoopPassAdaptor(LoopPassT &&Pass, bool UseMemorySSA=false)
A function to deduce a loop pass type and wrap it in the templated adaptor.
CGSCCToFunctionPassAdaptor createCGSCCToFunctionPassAdaptor(FunctionPassT &&Pass, bool EagerlyInvalidate=false, bool NoRerun=false)
A function to deduce a function pass type and wrap it in the templated adaptor.
CodeGenFileType
These enums are meant to be passed into addPassesToEmitFile to indicate what type of file to emit,...
FunctionToMachineFunctionPassAdaptor createFunctionToMachineFunctionPassAdaptor(MachineFunctionPassT &&Pass)
PassManager< Module > ModulePassManager
Convenience typedef for a pass manager over modules.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
CodeGenOptLevel
Code generation optimization level.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
PassManager< Function > FunctionPassManager
Convenience typedef for a pass manager over functions.
typename detail::detector< void, Op, Args... >::value_t is_detected
Detects if a given trait holds for some set of arguments 'Args'.
@ SjLj
setjmp/longjmp based exceptions
@ ZOS
z/OS MVS Exception Handling.
@ None
No exception support.
@ AIX
AIX Exception Handling.
@ DwarfCFI
DWARF-like instruction based exceptions.
@ WinEH
Windows Exception Handling.
@ Wasm
WebAssembly Exception Handling.
PassManager< MachineFunction > MachineFunctionPassManager
Convenience typedef for a pass manager over functions.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
Global function merging pass for new pass manager.
A utility pass template to force an analysis result to be available.