38 using Base = CodeGenPassBuilder;
40 RISCVTargetMachine &
getTM()
const {
41 return static_cast<RISCVTargetMachine &
>(TM);
45 explicit RISCVCodeGenPassBuilder(RISCVTargetMachine &TM,
46 const CGPassBuilderOption &Opts,
47 PassInstrumentationCallbacks *
PIC)
48 : CodeGenPassBuilder(TM, Opts,
PIC) {
56 void addIRPasses(PassManagerWrapper &PMW)
override;
57 void addCodeGenPrepare(PassManagerWrapper &PMW)
override;
58 Error addInstSelector(PassManagerWrapper &PMW)
override;
59 void addMachineSSAOptimization(PassManagerWrapper &PMW)
override;
60 void addPreRegAlloc(PassManagerWrapper &PMW)
override;
61 void addPostRegAlloc(PassManagerWrapper &PMW)
override;
62 void addPreSched2(PassManagerWrapper &PMW)
override;
63 void addPreEmitPass(PassManagerWrapper &PMW)
override;
64 void addPreEmitPass2(PassManagerWrapper &PMW)
override;
65 void addAsmPrinterBegin(PassManagerWrapper &PMW)
override;
66 void addAsmPrinter(PassManagerWrapper &PMW)
override;
67 void addAsmPrinterEnd(PassManagerWrapper &PMW)
override;
71 addFunctionPass(AtomicExpandPass(TM), PMW);
72 addFunctionPass(RISCVZacasABIFixPass(&
getTM()), PMW);
74 if (getOptLevel() != CodeGenOptLevel::None) {
75 addFunctionPass(LoopDataPrefetchPass(), PMW);
77 addFunctionPass(RISCVGatherScatterLoweringPass(&
getTM()), PMW);
78 addFunctionPass(InterleavedAccessPass(TM), PMW);
79 addFunctionPass(RISCVCodeGenPreparePass(&
getTM()), PMW);
82 Base::addIRPasses(PMW);
90void RISCVCodeGenPassBuilder::addCodeGenPrepare(PassManagerWrapper &PMW) {
91 if (getOptLevel() != CodeGenOptLevel::None)
92 addFunctionPass(TypePromotionPass(TM), PMW);
93 Base::addCodeGenPrepare(PMW);
96Error RISCVCodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) {
97 addMachineFunctionPass(RISCVISelDAGToDAGPass(
getTM(), getOptLevel()), PMW);
101void RISCVCodeGenPassBuilder::addMachineSSAOptimization(
102 PassManagerWrapper &PMW) {
105 if (getOptLevel() != CodeGenOptLevel::None) {
112 addMachineFunctionPass(EarlyMachineLICMPass(), PMW);
113 addMachineFunctionPass(RISCVVLOptimizerPass(), PMW);
116 addMachineFunctionPass(RISCVVectorPeepholePass(), PMW);
117 addMachineFunctionPass(RISCVFoldMemOffsetPass(), PMW);
119 Base::addMachineSSAOptimization(PMW);
121 if (TM.getTargetTriple().isRISCV64())
122 addMachineFunctionPass(RISCVOptWInstrsPass(), PMW);
125void RISCVCodeGenPassBuilder::addPreRegAlloc(PassManagerWrapper &PMW) {
126 addMachineFunctionPass(RISCVPreRAExpandPseudoPass(), PMW);
127 if (getOptLevel() != CodeGenOptLevel::None) {
141void RISCVCodeGenPassBuilder::addPostRegAlloc(PassManagerWrapper &PMW) {
142 if (getOptLevel() != CodeGenOptLevel::None) {
147void RISCVCodeGenPassBuilder::addPreSched2(PassManagerWrapper &PMW) {
148 addMachineFunctionPass(RISCVPostRAExpandPseudoPass(), PMW);
150 addMachineFunctionPass(MachineKCFIPass(), PMW);
151 if (getOptLevel() != CodeGenOptLevel::None) {
156void RISCVCodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW) {
162 if (getOptLevel() >= CodeGenOptLevel::Default) {
163 addMachineFunctionPass(MachineCopyPropagationPass(
true), PMW);
170 addMachineFunctionPass(BranchRelaxationPass(), PMW);
174void RISCVCodeGenPassBuilder::addPreEmitPass2(PassManagerWrapper &PMW) {
175 if (getOptLevel() != CodeGenOptLevel::None) {
179 addMachineFunctionPass(RISCVExpandPseudoPass(), PMW);
182 if (getOptLevel() != CodeGenOptLevel::None &&
183 TM.getTargetTriple().isRISCV32()) {
187 addMachineFunctionPass(RISCVExpandAtomicPseudoPass(), PMW);
190 addMachineFunctionPass(
201 if (!TM.Options.EnableCFIFixup)
202 addMachineFunctionPass(CFIInstrInserterPass(), PMW);
205void RISCVCodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW) {
206 addModulePass(RISCVAsmPrinterBeginPass(), PMW,
true);
209void RISCVCodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
210 addMachineFunctionPass(RISCVAsmPrinterPass(), PMW);
213void RISCVCodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
214 addModulePass(RISCVAsmPrinterEndPass(), PMW,
true);
220#define GET_PASS_REGISTRY "RISCVPassRegistry.def"
235 auto CGPB = RISCVCodeGenPassBuilder(*
this, Opt,
PIC);
236 return CGPB.buildPipeline(MPM,
MAM, Out, DwoOut, FileType, Ctx);
Interfaces for producing common pass manager configurations.
This file contains the declaration of the MachineKCFI class, which is a Machine Pass that implements ...
This file contains the declaration of the InterleavedAccessPass class, its corresponding pass name is...
This file provides the interface for LLVM's Loop Data Prefetching Pass.
ModuleAnalysisManager MAM
PassInstrumentationCallbacks PIC
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC)
This file defines the Pass Instrumentation classes that provide instrumentation points into the pass ...
const GCNTargetMachine & getTM(const GCNSubtarget *STI)
This class provides access to building LLVM's passes.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Module * getParent()
Get the module that this global value is contained inside of...
Context object for machine code objects.
Function & getFunction()
Return the LLVM function that this machine code represents.
Metadata * getModuleFlag(StringRef Key) const
Return the corresponding value if Key appears in module flags, otherwise return null.
This class provides access to building LLVM's passes.
This class manages callbacks registration, as well as provides a way for PassInstrumentation to pass ...
Error buildCodeGenPipeline(ModulePassManager &MPM, ModuleAnalysisManager &MAM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut, CodeGenFileType FileType, const CGPassBuilderOption &Opt, MCContext &Ctx, PassInstrumentationCallbacks *PIC) override
void registerPassBuilderCallbacks(PassBuilder &PB) override
Allow the target to modify the pass pipeline.
An abstract base class for streams implementations that also support a pwrite operation.
Interfaces for registering analysis passes, producing common pass manager configurations,...
This is an optimization pass for GlobalISel generic memory operations.
@ O0
Disable as many optimizations as possible.
PassManager< Loop, LoopAnalysisManager, LoopStandardAnalysisResults &, LPMUpdater & > LoopPassManager
The Loop pass manager.
CodeGenFileType
These enums are meant to be passed into addPassesToEmitFile to indicate what type of file to emit,...
PassManager< Module > ModulePassManager
Convenience typedef for a pass manager over modules.
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.