14#ifndef LLVM_PASSES_CODEGENPASSBUILDER_H
15#define LLVM_PASSES_CODEGENPASSBUILDER_H
131#include <type_traits>
138#define DUMMY_FUNCTION_PASS(NAME, PASS_NAME) \
139 struct PASS_NAME : public PassInfoMixin<PASS_NAME> { \
140 template <typename... Ts> PASS_NAME(Ts &&...) {} \
141 PreservedAnalyses run(Function &, FunctionAnalysisManager &) { \
142 return PreservedAnalyses::all(); \
145#define DUMMY_MACHINE_MODULE_PASS(NAME, PASS_NAME) \
146 struct PASS_NAME : public PassInfoMixin<PASS_NAME> { \
147 template <typename... Ts> PASS_NAME(Ts &&...) {} \
148 PreservedAnalyses run(Module &, ModuleAnalysisManager &) { \
149 return PreservedAnalyses::all(); \
152#define DUMMY_MACHINE_FUNCTION_PASS(NAME, PASS_NAME) \
153 struct PASS_NAME : public PassInfoMixin<PASS_NAME> { \
154 template <typename... Ts> PASS_NAME(Ts &&...) {} \
155 PreservedAnalyses run(MachineFunction &, \
156 MachineFunctionAnalysisManager &) { \
157 return PreservedAnalyses::all(); \
160#include "llvm/Passes/MachinePassRegistry.def"
179 if (
Opt.EnableIPRA) {
180 TM.Options.EnableIPRA = *Opt.EnableIPRA;
183 TM.Options.EnableIPRA |= TM.useIPRA();
186 if (
Opt.EnableGlobalISelAbort)
187 TM.Options.GlobalISelAbort = *
Opt.EnableGlobalISelAbort;
189 if (!
Opt.OptimizeRegAlloc)
202 template <
typename PassT>
204 std::declval<Module &>(), std::declval<ModuleAnalysisManager &>()));
206 template <
typename PassT>
208 std::declval<Function &>(), std::declval<FunctionAnalysisManager &>()));
210 template <
typename PassT>
212 std::declval<MachineFunction &>(),
213 std::declval<MachineFunctionAnalysisManager &>()));
224 template <
typename PassT>
229 "Only module pass and function pass are supported.");
230 if (!Force && !PB.runBeforeAdding(Name))
235 FPM.addPass(std::forward<PassT>(
Pass));
239 MPM.addPass(std::forward<PassT>(
Pass));
245 if (PB.AddInCGSCCOrder)
248 PB.AddInCGSCCOrder =
true;
254 if (!PB.AddInCGSCCOrder)
257 PB.AddInCGSCCOrder =
false;
261 void flushFPMToMPM() {
264 if (
PB.AddInCGSCCOrder) {
281 : MPM(MPM), PB(PB) {}
289 if (this->PB.AddInCGSCCOrder) {
296 template <
typename PassT>
301 "Only module pass and function pass are supported.");
303 if (!Force && !PB.runBeforeAdding(Name))
308 MFPM.addPass(std::forward<PassT>(
Pass));
312 MPM.addPass(std::forward<PassT>(
Pass));
315 for (
auto &
C : PB.AfterCallbacks)
321 if (PB.AddInCGSCCOrder)
324 PB.AddInCGSCCOrder =
true;
330 if (!PB.AddInCGSCCOrder)
333 PB.AddInCGSCCOrder =
false;
337 void flushMFPMToMPM() {
341 if (
PB.AddInCGSCCOrder) {
361 template <
typename TMC> TMC &
getTM()
const {
return static_cast<TMC &
>(
TM); }
486 "addGlobalInstructionSelect is not overridden",
552 std::function<Expected<std::unique_ptr<MCStreamer>>(
MCContext &)>;
576 BeforeCallbacks.emplace_back(
577 [](
StringRef Name) {
return ((Name != PassTs::name()) && ...); });
582 template <
typename TargetPassT,
typename InsertedPassT>
584 AfterCallbacks.emplace_back(
586 if (Name == TargetPassT::name() &&
587 runBeforeAdding(InsertedPassT::name())) {
594 DerivedT &derived() {
return static_cast<DerivedT &
>(*this); }
595 const DerivedT &derived()
const {
596 return static_cast<const DerivedT &
>(*this);
599 bool runBeforeAdding(StringRef Name)
const {
600 bool ShouldAdd =
true;
601 for (
auto &
C : BeforeCallbacks)
602 ShouldAdd &=
C(Name);
606 void setStartStopPasses(
const TargetPassConfig::StartStopInfo &
Info)
const;
608 Error verifyStartStop(
const TargetPassConfig::StartStopInfo &
Info)
const;
610 mutable SmallVector<llvm::unique_function<bool(StringRef)>, 4>
617 mutable bool Started =
true;
618 mutable bool Stopped =
true;
619 mutable bool AddInCGSCCOrder =
false;
622template <
typename Derived,
typename TargetMachineT>
628 return StartStopInfo.takeError();
629 setStartStopPasses(*StartStopInfo);
653 return std::move(Err);
656 return std::move(Err);
658 if (!
Opt.DisableVerify)
662 derived().addAsmPrinter(
663 addPass, [
this, &Out, DwoOut, FileType](
MCContext &Ctx) {
664 return this->TM.createMCStreamer(Out, DwoOut, FileType, Ctx);
671 return verifyStartStop(*StartStopInfo);
674template <
typename Derived,
typename TargetMachineT>
675void CodeGenPassBuilder<Derived, TargetMachineT>::setStartStopPasses(
677 if (!Info.StartPass.empty()) {
679 BeforeCallbacks.emplace_back([
this, &Info, AfterFlag = Info.StartAfter,
681 if (Count == Info.StartInstanceNum) {
689 auto PassName =
PIC->getPassNameForClassName(ClassName);
691 Started = !Info.StartAfter;
697 if (!
Info.StopPass.empty()) {
699 BeforeCallbacks.emplace_back([
this, &
Info, AfterFlag =
Info.StopAfter,
701 if (Count == Info.StopInstanceNum) {
711 Stopped = !
Info.StopAfter;
717template <
typename Derived,
typename TargetMachineT>
718Error CodeGenPassBuilder<Derived, TargetMachineT>::verifyStartStop(
720 if (Started && Stopped)
725 "Can't find start pass \"" +
Info.StartPass +
"\".",
726 std::make_error_code(std::errc::invalid_argument));
729 "Can't find stop pass \"" +
Info.StopPass +
"\".",
730 std::make_error_code(std::errc::invalid_argument));
734template <
typename Derived,
typename TargetMachineT>
737 derived().addGlobalMergePass(addPass);
738 if (
TM.useEmulatedTLS())
745 derived().addIRPasses(addPass);
746 derived().addCodeGenPrepare(addPass);
748 derived().addISelPrepare(addPass);
753template <
typename Derived,
typename TargetMachineT>
758 if (!
Opt.DisableVerify)
766 if (
Opt.EnableLoopTermFold)
777 if (!
Opt.DisableMergeICmps)
801 !
Opt.DisablePartialLibcallInlining)
813 if (!
Opt.DisableExpandReductions)
820 if (
Opt.EnableGlobalMergeFunc)
826template <
typename Derived,
typename TargetMachineT>
830 assert(MCAI &&
"No MCAsmInfo");
873template <
typename Derived,
typename TargetMachineT>
884template <
typename Derived,
typename TargetMachineT>
887 derived().addPreISel(addPass);
889 if (
Opt.RequiresCodeGenSCCOrder)
901 if (
Opt.PrintISelInput)
903 "\n\n*** Final LLVM Code input to ISel ***\n"));
907 if (!
Opt.DisableVerify)
911template <
typename Derived,
typename TargetMachineT>
915 TM.setO0WantsFastISel(
Opt.EnableFastISelOption.value_or(
true));
919 SelectorType Selector;
921 if (
Opt.EnableFastISelOption && *
Opt.EnableFastISelOption ==
true)
922 Selector = SelectorType::FastISel;
923 else if ((
Opt.EnableGlobalISelOption &&
924 *
Opt.EnableGlobalISelOption ==
true) ||
925 (
TM.Options.EnableGlobalISel &&
926 (!
Opt.EnableGlobalISelOption ||
927 *
Opt.EnableGlobalISelOption ==
false)))
928 Selector = SelectorType::GlobalISel;
930 Selector = SelectorType::FastISel;
932 Selector = SelectorType::SelectionDAG;
935 if (Selector == SelectorType::FastISel) {
936 TM.setFastISel(
true);
937 TM.setGlobalISel(
false);
938 }
else if (Selector == SelectorType::GlobalISel) {
939 TM.setFastISel(
false);
940 TM.setGlobalISel(
true);
944 if (Selector == SelectorType::GlobalISel) {
946 return std::move(Err);
948 derived().addPreLegalizeMachineIR(addPass);
951 return std::move(Err);
955 derived().addPreRegBankSelect(addPass);
958 return std::move(Err);
960 derived().addPreGlobalInstructionSelect(addPass);
963 return std::move(Err);
973 return std::move(Err);
976 return std::move(Err);
1004template <
typename Derived,
typename TargetMachineT>
1009 derived().addMachineSSAOptimization(addPass);
1016 if (
TM.Options.EnableIPRA) {
1021 derived().addPreRegAlloc(addPass);
1025 if (*
Opt.OptimizeRegAlloc) {
1026 derived().addOptimizedRegAlloc(addPass);
1033 derived().addPostRegAlloc(addPass);
1048 derived().addMachineLateOptimization(addPass);
1054 derived().addPreSched2(addPass);
1056 if (
Opt.EnableImplicitNullChecks)
1057 addPass(ImplicitNullChecksPass());
1063 !
TM.targetSchedulesPostRAScheduling()) {
1064 if (
Opt.MISchedPostRA)
1071 derived().addGCPasses(addPass);
1075 derived().addBlockPlacement(addPass);
1083 derived().addPreEmitPass(addPass);
1085 if (
TM.Options.EnableIPRA)
1090 addPass(FuncletLayoutPass());
1093 addPass(StackMapLivenessPass());
1098 if (
TM.Options.EnableMachineOutliner &&
1102 TM.Options.SupportsDefaultOutlining)
1103 addPass(MachineOutlinerPass(
Opt.EnableMachineOutliner));
1109 derived().addPreEmitPass2(addPass);
1115template <
typename Derived,
typename TargetMachineT>
1142 derived().addILPOpts(addPass);
1169template <
typename Derived,
typename TargetMachineT>
1184template <
typename Derived,
typename TargetMachineT>
1189 switch (
Opt.RegAlloc) {
1203 derived().addTargetRegisterAllocator(addPass, Optimized);
1206template <
typename Derived,
typename TargetMachineT>
1214template <
typename Derived,
typename TargetMachineT>
1221 derived().addPreRewrite(addPass);
1236template <
typename Derived,
typename TargetMachineT>
1241 return derived().addRegAssignmentFast(addPass);
1247template <
typename Derived,
typename TargetMachineT>
1274 if (
Opt.EarlyLiveIntervals)
1294 derived().addPostRewrite(addPass);
1311template <
typename Derived,
typename TargetMachineT>
1321 if (!
TM.requiresStructuredCFG())
1332template <
typename Derived,
typename TargetMachineT>
1337 if (
Opt.EnableBlockPlacementStats)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This is the interface for LLVM's primary stateless and local alias analysis.
This header provides classes for managing passes over SCCs of the call graph.
Analysis containing CSE Info
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.
PassInstrumentationCallbacks PIC
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &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.
AddIRPass(ModulePassManager &MPM, const DerivedT &PB)
void operator()(PassT &&Pass, bool Force=false, StringRef Name=PassT::name())
void requireCGSCCOrder()
Setting this will add passes to the CGSCC pass manager.
void stopAddingInCGSCCOrder()
Stop adding passes to the CGSCC pass manager.
void stopAddingInCGSCCOrder()
Stop adding passes to the CGSCC pass manager.
AddMachinePass(ModulePassManager &MPM, const DerivedT &PB)
void operator()(PassT &&Pass, bool Force=false, StringRef Name=PassT::name())
void requireCGSCCOrder()
Setting this will add passes to the CGSCC pass manager.
void addPreRewrite(AddMachinePass &) const
addPreRewrite - Add passes to the optimized register allocation pipeline after register allocation is...
void addPostRegAlloc(AddMachinePass &) const
This method may be implemented by targets that want to run passes after register allocation pass pipe...
void addPreGlobalInstructionSelect(AddMachinePass &) const
This method may be implemented by targets that want to run passes immediately before the (global) ins...
Error addRegAssignmentFast(AddMachinePass &) const
Add core register alloator passes which do the actual register assignment and rewriting.
decltype(std::declval< PassT & >().run( std::declval< Function & >(), std::declval< FunctionAnalysisManager & >())) is_function_pass_t
Error addFastRegAlloc(AddMachinePass &) const
addFastRegAlloc - Add the minimum set of target-independent passes that are required for fast registe...
Error addIRTranslator(AddMachinePass &) const
This method should install an IR translator pass, which converts from LLVM code to machine instructio...
void addILPOpts(AddMachinePass &) const
Add passes that optimize instruction level parallelism for out-of-order targets.
void addRegAllocPass(AddMachinePass &, bool Optimized) const
addMachinePasses helper to create the target-selected or overriden regalloc pass.
void addPreSched2(AddMachinePass &) const
This method may be implemented by targets that want to run passes after prolog-epilog insertion and b...
Error addRegBankSelect(AddMachinePass &) const
This method should install a register bank selector pass, which assigns register banks to virtual reg...
bool isGlobalISelAbortEnabled() const
Check whether or not GlobalISel should abort on error.
void addPreRegAlloc(AddMachinePass &) const
This method may be implemented by targets that want to run passes immediately before register allocat...
void insertPass(InsertedPassT &&Pass) const
Insert InsertedPass pass after TargetPass pass.
void addGCPasses(AddMachinePass &) const
addGCPasses - Add late codegen passes that analyze code for garbage collection.
Error buildPipeline(ModulePassManager &MPM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut, CodeGenFileType FileType) const
void addGlobalMergePass(AddIRPass &) const
Target can override this to add GlobalMergePass before all IR passes.
Error addLegalizeMachineIR(AddMachinePass &) const
This method should install a legalize pass, which converts the instruction sequence into one that can...
Error addCoreISelPasses(AddMachinePass &) const
Add the actual instruction selection passes.
std::function< Expected< std::unique_ptr< MCStreamer > >(MCContext &)> CreateMCStreamer
void addOptimizedRegAlloc(AddMachinePass &) const
addOptimizedRegAlloc - Add passes related to register allocation.
void addISelPasses(AddIRPass &) const
High level function that adds all passes necessary to go from llvm IR representation to the MI repres...
decltype(std::declval< PassT & >().run( std::declval< MachineFunction & >(), std::declval< MachineFunctionAnalysisManager & >())) is_machine_function_pass_t
PassInstrumentationCallbacks * PIC
void addMachineSSAOptimization(AddMachinePass &) const
Methods with trivial inline returns are convenient points in the common codegen pass pipeline where t...
CodeGenPassBuilder(TargetMachineT &TM, const CGPassBuilderOption &Opts, PassInstrumentationCallbacks *PIC)
Error addRegAssignmentOptimized(AddMachinePass &) const
void addCodeGenPrepare(AddIRPass &) const
Add pass to prepare the LLVM IR for code generation.
Error addMachinePasses(AddMachinePass &) const
Add the complete, standard set of LLVM CodeGen passes.
void addISelPrepare(AddIRPass &) const
Add common passes that perform LLVM IR to IR transforms in preparation for instruction selection.
void disablePass()
Allow the target to disable a specific pass by default.
void addBlockPlacement(AddMachinePass &) const
Add standard basic block placement passes.
Error addInstSelector(AddMachinePass &) const
addInstSelector - This method should install an instruction selector pass, which converts from LLVM c...
void addTargetRegisterAllocator(AddMachinePass &, bool Optimized) const
Utilities for targets to add passes to the pass manager.
void addPreEmitPass2(AddMachinePass &) const
Targets may add passes immediately before machine code is emitted in this callback.
void addPostRewrite(AddMachinePass &) const
Add passes to be run immediately after virtual registers are rewritten to physical registers.
void addPreRegBankSelect(AddMachinePass &) const
This method may be implemented by targets that want to run passes immediately before the register ban...
void addPreEmitPass(AddMachinePass &) const
This pass may be implemented by targets that want to run passes immediately before machine code is em...
Error addGlobalInstructionSelect(AddMachinePass &) const
This method should install a (global) instruction selector pass, which converts possibly generic inst...
void addMachineLateOptimization(AddMachinePass &) const
Add passes that optimize machine instructions after register allocation.
void addIRPasses(AddIRPass &) const
Add common target configurable passes that perform LLVM IR to IR transforms following machine indepen...
decltype(std::declval< PassT & >().run( std::declval< Module & >(), std::declval< ModuleAnalysisManager & >())) is_module_pass_t
void addPreLegalizeMachineIR(AddMachinePass &) const
This method may be implemented by targets that want to run passes immediately before legalization.
CodeGenOptLevel getOptLevel() const
void addPassesToHandleExceptions(AddIRPass &) const
Add passes to lower exception handling for the code generator.
PassInstrumentationCallbacks * getPassInstrumentationCallbacks() const
bool reportDiagnosticWhenGlobalISelFallback() const
Check whether or not a diagnostic should be emitted when GlobalISel uses the fallback path.
void addPreISel(AddIRPass &) const
{{@ For GlobalISel
void addAsmPrinter(AddMachinePass &, CreateMCStreamer) const
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success 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.
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...
StringRef - 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.
@ C
The default llvm calling convention, compatible with C.
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...
@ 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< 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.
FunctionAddr VTableAddr Count
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.
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'.
PassManager< MachineFunction > MachineFunctionPassManager
Convenience typedef for a pass manager over functions.
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.