49 using Base = CodeGenPassBuilder;
51 RISCVTargetMachine &
getTM()
const {
52 return static_cast<RISCVTargetMachine &
>(TM);
56 explicit RISCVCodeGenPassBuilder(RISCVTargetMachine &TM,
57 const CGPassBuilderOption &Opts,
58 PassInstrumentationCallbacks *
PIC)
59 : CodeGenPassBuilder(TM, Opts,
PIC) {
67 void addIRPasses(PassManagerWrapper &PMW)
override;
68 void addPreISel(PassManagerWrapper &PMW)
override;
69 void addCodeGenPrepare(PassManagerWrapper &PMW)
override;
71 Error addInstSelector(PassManagerWrapper &PMW)
override;
73 Error addIRTranslator(PassManagerWrapper &PMW)
override;
74 void addPreLegalizeMachineIR(PassManagerWrapper &PMW)
override;
75 Error addLegalizeMachineIR(PassManagerWrapper &PMW)
override;
76 void addPreRegBankSelect(PassManagerWrapper &PMW)
override;
77 Error addRegBankSelect(PassManagerWrapper &PMW)
override;
78 Error addGlobalInstructionSelect(PassManagerWrapper &PMW)
override;
80 void addMachineSSAOptimization(PassManagerWrapper &PMW)
override;
81 void addILPOpts(PassManagerWrapper &PMW)
override;
82 void addPreRegAlloc(PassManagerWrapper &PMW)
override;
83 Error addFastRegAlloc(PassManagerWrapper &PMW)
override;
84 Error addRegAssignAndRewriteFast(PassManagerWrapper &PMW)
override;
86 addRegAssignAndRewriteOptimized(PassManagerWrapper &PMW)
override;
87 void addPostRegAlloc(PassManagerWrapper &PMW)
override;
88 void addPreSched2(PassManagerWrapper &PMW)
override;
89 void addPreEmitPass(PassManagerWrapper &PMW)
override;
90 void addPreEmitPass2(PassManagerWrapper &PMW)
override;
91 void addAsmPrinterBegin(PassManagerWrapper &PMW)
override;
92 void addAsmPrinter(PassManagerWrapper &PMW)
override;
93 void addAsmPrinterEnd(PassManagerWrapper &PMW)
override;
97 addFunctionPass(AtomicExpandPass(TM), PMW);
98 addFunctionPass(RISCVZacasABIFixPass(&
getTM()), PMW);
100 if (getOptLevel() != CodeGenOptLevel::None) {
102 addFunctionPass(LoopDataPrefetchPass(), PMW);
104 addFunctionPass(RISCVGatherScatterLoweringPass(&
getTM()), PMW);
105 addFunctionPass(InterleavedAccessPass(TM), PMW);
106 addFunctionPass(RISCVCodeGenPreparePass(&
getTM()), PMW);
109 Base::addIRPasses(PMW);
111 if (getOptLevel() == CodeGenOptLevel::Aggressive &&
113 addFunctionPass(SelectOptimizePass(
getTM()), PMW);
116void RISCVCodeGenPassBuilder::addPreISel(PassManagerWrapper &PMW) {
117 if (getOptLevel() != CodeGenOptLevel::None) {
119 addModulePass(RISCVPromoteConstantPass(&
getTM()), PMW);
123 getOptLevel() != CodeGenOptLevel::None)) {
129 GlobalMergeOptions GMOptions;
133 addModulePass(GlobalMergePass(&
getTM(), GMOptions), PMW);
137void RISCVCodeGenPassBuilder::addCodeGenPrepare(PassManagerWrapper &PMW) {
138 if (getOptLevel() != CodeGenOptLevel::None)
139 addFunctionPass(TypePromotionPass(TM), PMW);
140 Base::addCodeGenPrepare(PMW);
143Error RISCVCodeGenPassBuilder::addInstSelector(PassManagerWrapper &PMW) {
144 addMachineFunctionPass(RISCVISelDAGToDAGPass(
getTM(), getOptLevel()), PMW);
148Error RISCVCodeGenPassBuilder::addIRTranslator(PassManagerWrapper &PMW) {
149 addMachineFunctionPass(IRTranslatorPass(getOptLevel()), PMW);
153void RISCVCodeGenPassBuilder::addPreLegalizeMachineIR(PassManagerWrapper &PMW) {
154 if (getOptLevel() == CodeGenOptLevel::None)
155 addMachineFunctionPass(RISCVO0PreLegalizerCombinerPass(), PMW);
157 addMachineFunctionPass(RISCVPreLegalizerCombinerPass(), PMW);
160Error RISCVCodeGenPassBuilder::addLegalizeMachineIR(PassManagerWrapper &PMW) {
161 addMachineFunctionPass(LegalizerPass(), PMW);
165void RISCVCodeGenPassBuilder::addPreRegBankSelect(PassManagerWrapper &PMW) {
166 if (getOptLevel() != CodeGenOptLevel::None)
167 addMachineFunctionPass(RISCVPostLegalizerCombinerPass(), PMW);
170Error RISCVCodeGenPassBuilder::addRegBankSelect(PassManagerWrapper &PMW) {
171 addMachineFunctionPass(RegBankSelectPass(), PMW);
175Error RISCVCodeGenPassBuilder::addGlobalInstructionSelect(
176 PassManagerWrapper &PMW) {
177 addMachineFunctionPass(InstructionSelectPass(getOptLevel()), PMW);
181void RISCVCodeGenPassBuilder::addMachineSSAOptimization(
182 PassManagerWrapper &PMW) {
185 if (getOptLevel() != CodeGenOptLevel::None) {
192 addMachineFunctionPass(EarlyMachineLICMPass(), PMW);
193 addMachineFunctionPass(RISCVVLOptimizerPass(), PMW);
196 addMachineFunctionPass(RISCVVectorPeepholePass(), PMW);
197 addMachineFunctionPass(RISCVFoldMemOffsetPass(), PMW);
199 Base::addMachineSSAOptimization(PMW);
201 if (TM.getTargetTriple().isRISCV64())
202 addMachineFunctionPass(RISCVOptWInstrsPass(), PMW);
205void RISCVCodeGenPassBuilder::addILPOpts(PassManagerWrapper &PMW) {
207 addMachineFunctionPass(MachineCombinerPass(), PMW);
210void RISCVCodeGenPassBuilder::addPreRegAlloc(PassManagerWrapper &PMW) {
211 addMachineFunctionPass(RISCVExpandPseudoPreRAPass(), PMW);
212 if (getOptLevel() != CodeGenOptLevel::None) {
213 addMachineFunctionPass(RISCVMergeBaseOffsetPass(), PMW);
215 addMachineFunctionPass(RISCVPreAllocZilsdOptPass(), PMW);
218 addMachineFunctionPass(RISCVInsertReadWriteCSRPass(), PMW);
219 addMachineFunctionPass(RISCVInsertWriteVXRMPass(), PMW);
220 addMachineFunctionPass(RISCVLandingPadSetupPass(), PMW);
221 addMachineFunctionPass(RISCVVMV0EliminationPass(), PMW);
224Error RISCVCodeGenPassBuilder::addFastRegAlloc(PassManagerWrapper &PMW) {
225 addMachineFunctionPass(InitUndefPass(), PMW);
226 return Base::addFastRegAlloc(PMW);
229static bool onlyAllocateRVVReg(
const TargetRegisterInfo &
TRI,
230 const MachineRegisterInfo &
MRI,
236Error RISCVCodeGenPassBuilder::addRegAssignAndRewriteFast(
237 PassManagerWrapper &PMW) {
238 addMachineFunctionPass(
239 RegAllocFastPass({onlyAllocateRVVReg,
"rvv",
false}), PMW);
240 addMachineFunctionPass(RISCVInsertVSETVLIPass(), PMW);
241 if (getOptLevel() != CodeGenOptLevel::None &&
243 addMachineFunctionPass(RISCVDeadRegisterDefinitionsPass(), PMW);
244 return Base::addRegAssignAndRewriteFast(PMW);
247Expected<bool> RISCVCodeGenPassBuilder::addRegAssignAndRewriteOptimized(
248 PassManagerWrapper &PMW) {
249 addMachineFunctionPass(RAGreedyPass({onlyAllocateRVVReg,
"rvv"}), PMW);
250 addMachineFunctionPass(VirtRegRewriterPass(
false), PMW);
251 addMachineFunctionPass(RISCVInsertVSETVLIPass(), PMW);
252 if (getOptLevel() != CodeGenOptLevel::None &&
254 addMachineFunctionPass(RISCVDeadRegisterDefinitionsPass(), PMW);
255 return Base::addRegAssignAndRewriteOptimized(PMW);
258void RISCVCodeGenPassBuilder::addPostRegAlloc(PassManagerWrapper &PMW) {
259 if (getOptLevel() != CodeGenOptLevel::None &&
261 addMachineFunctionPass(RISCVRedundantCopyEliminationPass(), PMW);
264void RISCVCodeGenPassBuilder::addPreSched2(PassManagerWrapper &PMW) {
265 addMachineFunctionPass(RISCVExpandPseudoPostRAPass(), PMW);
267 addMachineFunctionPass(MachineKCFIPass(), PMW);
268 if (getOptLevel() != CodeGenOptLevel::None)
269 addMachineFunctionPass(RISCVLoadStoreOptPass(), PMW);
272void RISCVCodeGenPassBuilder::addPreEmitPass(PassManagerWrapper &PMW) {
278 if (getOptLevel() >= CodeGenOptLevel::Default &&
280 addMachineFunctionPass(MachineCopyPropagationPass(
true), PMW);
281 if (getOptLevel() >= CodeGenOptLevel::Default)
282 addMachineFunctionPass(RISCVLateBranchOptPass(), PMW);
286 addMachineFunctionPass(RISCVIndirectBranchTrackingPass(), PMW);
287 addMachineFunctionPass(BranchRelaxationPass(), PMW);
288 addMachineFunctionPass(RISCVMakeCompressiblePass(), PMW);
291void RISCVCodeGenPassBuilder::addPreEmitPass2(PassManagerWrapper &PMW) {
292 if (getOptLevel() != CodeGenOptLevel::None) {
293 addMachineFunctionPass(RISCVMoveMergePass(), PMW);
296 addMachineFunctionPass(RISCVPushPopOptPass(), PMW);
298 addMachineFunctionPass(RISCVExpandPseudoPreEmitPass(), PMW);
301 if (getOptLevel() != CodeGenOptLevel::None &&
302 TM.getTargetTriple().isRISCV32()) {
303 addMachineFunctionPass(RISCVQCRelaxMarkingPass(), PMW);
309 addMachineFunctionPass(RISCVExpandPseudoAtomicsPass(), PMW);
312 addMachineFunctionPass(
324 addMachineFunctionPass(CFIInstrInserterPass(), PMW);
327void RISCVCodeGenPassBuilder::addAsmPrinterBegin(PassManagerWrapper &PMW) {
328 addModulePass(RISCVAsmPrinterBeginPass(), PMW,
true);
331void RISCVCodeGenPassBuilder::addAsmPrinter(PassManagerWrapper &PMW) {
332 addMachineFunctionPass(RISCVAsmPrinterPass(), PMW);
335void RISCVCodeGenPassBuilder::addAsmPrinterEnd(PassManagerWrapper &PMW) {
336 addModulePass(RISCVAsmPrinterEndPass(), PMW,
true);
342#define GET_PASS_REGISTRY "RISCVPassRegistry.def"
357 auto CGPB = RISCVCodeGenPassBuilder(*
this, Opt,
PIC);
358 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 declares the IRTranslator pass.
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.
Register const TargetRegisterInfo * TRI
Promote Memory to Register
ModuleAnalysisManager MAM
PassBuilder PB(Mod->getContext(), Machine, PassOpts->PTO, std::nullopt, &PIC)
PassInstrumentationCallbacks PIC
This file defines the Pass Instrumentation classes that provide instrumentation points into the pass ...
MachineRegisterInfo & MRI
This file describes the interface of the MachineFunctionPass responsible for assigning the generic vi...
const GCNTargetMachine & getTM(const GCNSubtarget *STI)
This file contains the declaration of the SelectOptimizePass class, its corresponding pass name is se...
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.
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
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,...
const AArch64MCOptions & getCLOpts(const MCTargetOptions &Options)
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.
constexpr bool valueOr(BoolOrDefault X, bool Default)
AnalysisManager< Module > ModuleAnalysisManager
Convenience typedef for the Module analysis manager.
MCRegisterClass TargetRegisterClass
bool SizeOnly
Whether we should try to optimize for size only.
bool MergeExternal
Whether we should merge global variables that have external linkage.
static bool isRVVRegClass(const TargetRegisterClass *RC)