LLVM 24.0.0git
RISCVTargetMachine.cpp
Go to the documentation of this file.
1//===-- RISCVTargetMachine.cpp - Define TargetMachine for RISC-V ----------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Implements the info about RISC-V target spec.
10//
11//===----------------------------------------------------------------------===//
12
13#include "RISCVTargetMachine.h"
14#include "RISCV.h"
30#include "llvm/CodeGen/Passes.h"
39#include "llvm/Transforms/IPO.h"
41#include <optional>
42using namespace llvm;
43
85}
86
88 std::optional<Reloc::Model> RM) {
89 if (TT.isOSBinFormatMachO())
90 return RM.value_or(Reloc::PIC_);
91
92 return RM.value_or(Reloc::Static);
93}
94
95static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) {
96 if (TT.isOSBinFormatMachO())
97 return std::make_unique<RISCVMachOTargetObjectFile>();
98 return std::make_unique<RISCVELFTargetObjectFile>();
99}
100
102 StringRef CPU, StringRef FS,
103 const TargetOptions &Options,
104 std::optional<Reloc::Model> RM,
105 std::optional<CodeModel::Model> CM,
106 CodeGenOptLevel OL, bool JIT)
107 : CodeGenTargetMachineImpl(T, TT, CPU, FS, Options,
109 getEffectiveCodeModel(CM, CodeModel::Small), OL),
110 CLOpts(RISCVOptions::Global), TLOF(createTLOF(TT)) {
111 initAsmInfo();
112
113 // RISC-V supports the MachineOutliner.
114 setMachineOutliner(true);
116
117 // RISC-V supports the debug entry values.
119
120 if (TT.isOSFuchsia() && !TT.isArch64Bit())
121 report_fatal_error("Fuchsia is only supported for 64-bit");
122
123 setCFIFixup(!CLOpts.enable_cfi_instr_inserter);
124}
125
126const RISCVSubtarget *
128 Attribute CPUAttr = F.getFnAttribute("target-cpu");
129 Attribute TuneAttr = F.getFnAttribute("tune-cpu");
130 Attribute FSAttr = F.getFnAttribute("target-features");
131
132 std::string CPU =
133 CPUAttr.isValid() ? CPUAttr.getValueAsString().str() : TargetCPU;
134 std::string TuneCPU =
135 TuneAttr.isValid() ? TuneAttr.getValueAsString().str() : CPU;
136 std::string FS =
137 FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS;
138
139 unsigned RVVBitsMin = CLOpts.v_vector_bits_min.value_or(-1);
140 unsigned RVVBitsMax = CLOpts.v_vector_bits_max.value_or(0);
141
142 Attribute VScaleRangeAttr = F.getFnAttribute(Attribute::VScaleRange);
143 if (VScaleRangeAttr.isValid()) {
144 if (!CLOpts.v_vector_bits_min)
145 RVVBitsMin = VScaleRangeAttr.getVScaleRangeMin() * RISCV::RVVBitsPerBlock;
146 std::optional<unsigned> VScaleMax = VScaleRangeAttr.getVScaleRangeMax();
147 if (VScaleMax.has_value() && !CLOpts.v_vector_bits_max)
148 RVVBitsMax = *VScaleMax * RISCV::RVVBitsPerBlock;
149 }
150
151 if (RVVBitsMin != -1U) {
152 // FIXME: Change to >= 32 when VLEN = 32 is supported.
153 assert((RVVBitsMin == 0 || (RVVBitsMin >= 64 && RVVBitsMin <= 65536 &&
154 isPowerOf2_32(RVVBitsMin))) &&
155 "V or Zve* extension requires vector length to be in the range of "
156 "64 to 65536 and a power 2!");
157 assert((RVVBitsMax >= RVVBitsMin || RVVBitsMax == 0) &&
158 "Minimum V extension vector length should not be larger than its "
159 "maximum!");
160 }
161 assert((RVVBitsMax == 0 || (RVVBitsMax >= 64 && RVVBitsMax <= 65536 &&
162 isPowerOf2_32(RVVBitsMax))) &&
163 "V or Zve* extension requires vector length to be in the range of "
164 "64 to 65536 and a power 2!");
165
166 if (RVVBitsMin != -1U) {
167 if (RVVBitsMax != 0) {
168 RVVBitsMin = std::min(RVVBitsMin, RVVBitsMax);
169 RVVBitsMax = std::max(RVVBitsMin, RVVBitsMax);
170 }
171
172 RVVBitsMin = llvm::bit_floor(
173 (RVVBitsMin < 64 || RVVBitsMin > 65536) ? 0 : RVVBitsMin);
174 }
175 RVVBitsMax =
176 llvm::bit_floor((RVVBitsMax < 64 || RVVBitsMax > 65536) ? 0 : RVVBitsMax);
177
179 raw_svector_ostream(Key) << "RVVMin" << RVVBitsMin << "RVVMax" << RVVBitsMax
180 << CPU << TuneCPU << FS;
181 auto &I = SubtargetMap[Key];
182 if (!I) {
183 StringRef ABIName = getTargetABIName(*F.getParent());
184 I = std::make_unique<RISCVSubtarget>(
185 TargetTriple, CPU, TuneCPU, FS, ABIName, RVVBitsMin, RVVBitsMax, *this);
186 }
187 return I.get();
188}
189
196
199 return TargetTransformInfo(std::make_unique<RISCVTTIImpl>(this, F));
200}
201
202// A RISC-V hart has a single byte-addressable address space of 2^XLEN bytes
203// for all memory accesses, so it is reasonable to assume that an
204// implementation has no-op address space casts. If an implementation makes a
205// change to this, they can override it here.
207 unsigned SrcAS,
208 unsigned DstAS) const {
209 return true;
210}
211
214 const RISCVSubtarget &ST = C->MF->getSubtarget<RISCVSubtarget>();
216
217 // Add MacroFusion mutation first with a higher priority than later clustering
218 const auto &MacroFusions = ST.getMacroFusions();
219 if (!MacroFusions.empty())
220 DAG->addMutation(createMacroFusionDAGMutation(MacroFusions));
221
222 if (ST.enableMISchedLoadClustering())
223 DAG->addMutation(createLoadClusterDAGMutation(
224 DAG->TII, /*ReorderWhileClustering=*/true));
225
226 if (ST.enableMISchedStoreClustering())
227 DAG->addMutation(createStoreClusterDAGMutation(
228 DAG->TII, /*ReorderWhileClustering=*/true));
229
230 if (CLOpts.vector_mask_mutation && ST.hasVInstructions())
231 DAG->addMutation(createRISCVVectorMaskDAGMutation(DAG->TRI));
232
233 return DAG;
234}
235
238 const RISCVSubtarget &ST = C->MF->getSubtarget<RISCVSubtarget>();
240
241 // Add MacroFusion mutation first with a higher priority than later clustering
242 const auto &MacroFusions = ST.getMacroFusions();
243 if (!MacroFusions.empty())
244 DAG->addMutation(createMacroFusionDAGMutation(MacroFusions));
245
246 if (ST.enablePostMISchedLoadClustering())
247 DAG->addMutation(createLoadClusterDAGMutation(
248 DAG->TII, /*ReorderWhileClustering=*/true));
249
250 if (ST.enablePostMISchedStoreClustering())
251 DAG->addMutation(createStoreClusterDAGMutation(
252 DAG->TII, /*ReorderWhileClustering=*/true));
253
254 return DAG;
255}
256
257namespace {
258
259class RVVRegisterRegAlloc : public RegisterRegAllocBase<RVVRegisterRegAlloc> {
260public:
261 RVVRegisterRegAlloc(const char *N, const char *D, FunctionPassCtor C)
262 : RegisterRegAllocBase(N, D, C) {}
263};
264
265static bool onlyAllocateRVVReg(const TargetRegisterInfo &TRI,
266 const MachineRegisterInfo &MRI,
267 const Register Reg) {
268 const TargetRegisterClass *RC = MRI.getRegClass(Reg);
270}
271
272static FunctionPass *useDefaultRegisterAllocator() { return nullptr; }
273
274static llvm::once_flag InitializeDefaultRVVRegisterAllocatorFlag;
275
276/// -riscv-rvv-regalloc=<fast|basic|greedy> command line option.
277/// This option could designate the rvv register allocator only.
278/// For example: -riscv-rvv-regalloc=basic
279static cl::opt<RVVRegisterRegAlloc::FunctionPassCtor, false,
281 RVVRegAlloc("riscv-rvv-regalloc", cl::Hidden,
283 cl::desc("Register allocator to use for RVV register."));
284
285static void initializeDefaultRVVRegisterAllocatorOnce() {
286 RegisterRegAlloc::FunctionPassCtor Ctor = RVVRegisterRegAlloc::getDefault();
287
288 if (!Ctor) {
289 Ctor = RVVRegAlloc;
290 RVVRegisterRegAlloc::setDefault(RVVRegAlloc);
291 }
292}
293
294static FunctionPass *createBasicRVVRegisterAllocator() {
295 return createBasicRegisterAllocator(onlyAllocateRVVReg);
296}
297
298static FunctionPass *createGreedyRVVRegisterAllocator() {
299 return createGreedyRegisterAllocator(onlyAllocateRVVReg);
300}
301
302static FunctionPass *createFastRVVRegisterAllocator() {
303 return createFastRegisterAllocator(onlyAllocateRVVReg, false);
304}
305
306static RVVRegisterRegAlloc basicRegAllocRVVReg("basic",
307 "basic register allocator",
308 createBasicRVVRegisterAllocator);
309static RVVRegisterRegAlloc
310 greedyRegAllocRVVReg("greedy", "greedy register allocator",
311 createGreedyRVVRegisterAllocator);
312
313static RVVRegisterRegAlloc fastRegAllocRVVReg("fast", "fast register allocator",
314 createFastRVVRegisterAllocator);
315
316class RISCVPassConfig : public TargetPassConfig {
317 const RISCVOptions &CLOpts;
318
319public:
320 RISCVPassConfig(RISCVTargetMachine &TM, PassManagerBase &PM)
321 : TargetPassConfig(TM, PM), CLOpts(TM.getCLOpts()) {
322 if (TM.getOptLevel() != CodeGenOptLevel::None)
323 substitutePass(&PostRASchedulerID, &PostMachineSchedulerID);
324 setEnableSinkAndFold(CLOpts.enable_sink_fold);
325 EnableLoopTermFold = true;
326 }
327
328 RISCVTargetMachine &getRISCVTargetMachine() const {
330 }
331
332 void addIRPasses() override;
333 bool addPreISel() override;
334 void addCodeGenPrepare() override;
335 bool addInstSelector() override;
336 bool addIRTranslator() override;
337 void addPreLegalizeMachineIR() override;
338 bool addLegalizeMachineIR() override;
339 void addPreRegBankSelect() override;
340 bool addRegBankSelect() override;
341 bool addGlobalInstructionSelect() override;
342 void addPreEmitPass() override;
343 void addPreEmitPass2() override;
344 void addPreSched2() override;
345 void addMachineSSAOptimization() override;
346 FunctionPass *createRVVRegAllocPass(bool Optimized);
347 bool addRegAssignAndRewriteFast() override;
348 bool addRegAssignAndRewriteOptimized() override;
349 void addPreRegAlloc() override;
350 void addPostRegAlloc() override;
351 void addFastRegAlloc() override;
352 bool addILPOpts() override;
353
354 std::unique_ptr<CSEConfigBase> getCSEConfig() const override;
355};
356} // namespace
357
359 return new RISCVPassConfig(*this, PM);
360}
361
362std::unique_ptr<CSEConfigBase> RISCVPassConfig::getCSEConfig() const {
363 return getStandardCSEConfigForOpt(TM->getOptLevel());
364}
365
366FunctionPass *RISCVPassConfig::createRVVRegAllocPass(bool Optimized) {
367 // Initialize the global default.
368 llvm::call_once(InitializeDefaultRVVRegisterAllocatorFlag,
369 initializeDefaultRVVRegisterAllocatorOnce);
370
371 RegisterRegAlloc::FunctionPassCtor Ctor = RVVRegisterRegAlloc::getDefault();
372 if (Ctor != useDefaultRegisterAllocator)
373 return Ctor();
374
375 if (Optimized)
376 return createGreedyRVVRegisterAllocator();
377
378 return createFastRVVRegisterAllocator();
379}
380
381bool RISCVPassConfig::addRegAssignAndRewriteFast() {
382 addPass(createRVVRegAllocPass(false));
384 if (TM->getOptLevel() != CodeGenOptLevel::None && CLOpts.enable_dead_defs)
387}
388
389bool RISCVPassConfig::addRegAssignAndRewriteOptimized() {
390 addPass(createRVVRegAllocPass(true));
391 addPass(createVirtRegRewriter(false));
393 if (TM->getOptLevel() != CodeGenOptLevel::None && CLOpts.enable_dead_defs)
396}
397
398void RISCVPassConfig::addIRPasses() {
401
402 if (getOptLevel() != CodeGenOptLevel::None) {
403 if (CLOpts.enable_loop_data_prefetch)
405
409 }
410
412
413 if (getOptLevel() == CodeGenOptLevel::Aggressive && CLOpts.select_opt)
414 addPass(createSelectOptimizePass());
415}
416
417bool RISCVPassConfig::addPreISel() {
418 if (TM->getOptLevel() != CodeGenOptLevel::None)
420 if (TM->getOptLevel() != CodeGenOptLevel::None) {
421 // Add a barrier before instruction selection so that we will not get
422 // deleted block address after enabling default outlining. See D99707 for
423 // more details.
424 addPass(createBarrierNoopPass());
425 }
426
427 if (valueOr(CLOpts.enable_global_merge,
428 TM->getOptLevel() != CodeGenOptLevel::None)) {
429 // FIXME: Like AArch64, we disable extern global merging by default due to
430 // concerns it might regress some workloads. Unlike AArch64, we don't
431 // currently support enabling the pass in an "OnlyOptimizeForSize" mode.
432 // Investigating and addressing both items are TODO.
433 addPass(createGlobalMergePass(TM, /* MaxOffset */ 2047,
434 /* OnlyOptimizeForSize */ false,
435 /* MergeExternalByDefault */ true));
436 }
437
438 return false;
439}
440
441void RISCVPassConfig::addCodeGenPrepare() {
442 if (getOptLevel() != CodeGenOptLevel::None)
445}
446
447bool RISCVPassConfig::addInstSelector() {
448 addPass(createRISCVISelDagLegacyPass(getRISCVTargetMachine(), getOptLevel()));
449
450 return false;
451}
452
453bool RISCVPassConfig::addIRTranslator() {
454 addPass(new IRTranslatorLegacy(getOptLevel()));
455 return false;
456}
457
458void RISCVPassConfig::addPreLegalizeMachineIR() {
459 if (getOptLevel() == CodeGenOptLevel::None) {
461 } else {
463 }
464}
465
466bool RISCVPassConfig::addLegalizeMachineIR() {
467 addPass(new LegalizerLegacy());
468 return false;
469}
470
471void RISCVPassConfig::addPreRegBankSelect() {
472 if (getOptLevel() != CodeGenOptLevel::None)
474}
475
476bool RISCVPassConfig::addRegBankSelect() {
477 addPass(new RegBankSelectLegacy());
478 return false;
479}
480
481bool RISCVPassConfig::addGlobalInstructionSelect() {
482 addPass(new InstructionSelectLegacy(getOptLevel()));
483 return false;
484}
485
486void RISCVPassConfig::addPreSched2() {
488
489 // Emit KCFI checks for indirect calls.
490 addPass(createKCFIPass());
491 if (TM->getOptLevel() != CodeGenOptLevel::None)
493}
494
495void RISCVPassConfig::addPreEmitPass() {
496 // TODO: It would potentially be better to schedule copy propagation after
497 // expanding pseudos (in addPreEmitPass2). However, performing copy
498 // propagation after the machine outliner (which runs after addPreEmitPass)
499 // currently leads to incorrect code-gen, where copies to registers within
500 // outlined functions are removed erroneously.
501 if (TM->getOptLevel() >= CodeGenOptLevel::Default &&
502 CLOpts.enable_copy_propagation)
504 if (TM->getOptLevel() >= CodeGenOptLevel::Default)
506 // The IndirectBranchTrackingPass inserts lpad and could have changed the
507 // basic block alignment. It must be done before Branch Relaxation to
508 // prevent the adjusted offset exceeding the branch range.
510 addPass(&BranchRelaxationPassID);
512}
513
514void RISCVPassConfig::addPreEmitPass2() {
515 if (TM->getOptLevel() != CodeGenOptLevel::None) {
516 addPass(createRISCVMoveMergePass());
517 // Schedule PushPop Optimization before expansion of Pseudo instruction,
518 // ensuring return instruction is detected correctly.
520 }
522
523 // Add QC Relaxation Markers as late as possible, and only for RV32
524 if (TM->getOptLevel() != CodeGenOptLevel::None &&
525 TM->getTargetTriple().isRISCV32())
527
528 // Schedule the expansion of AMOs at the last possible moment, avoiding the
529 // possibility for other passes to break the requirements for forward
530 // progress in the LR/SC block.
532
533 // KCFI indirect call checks are lowered to a bundle.
535 return MF.getFunction().getParent()->getModuleFlag("kcfi");
536 }));
537
538 if (CLOpts.enable_cfi_instr_inserter)
540}
541
542void RISCVPassConfig::addMachineSSAOptimization() {
543 // It's beneficial to reduce the VL to enable more
544 // Machine SSA optimizations.
545 if (TM->getOptLevel() != CodeGenOptLevel::None) {
546 // RISCVVLOptimizer can make loop invariant instructions like vmv.v.i
547 // loop variant by propagating a VL defined inside the loop. Run LICM and
548 // hoist them early. Don't do this at -O0 to avoid the compile-time
549 // overhead. Not reducing the VL of loop invariant pseudos results in more
550 // vsetvli toggles, and still requires the MachineLoopInfo analysis to be
551 // run.
552 addPass(&EarlyMachineLICMID);
554 }
555
558
560
561 if (TM->getTargetTriple().isRISCV64()) {
563 }
564}
565
566void RISCVPassConfig::addPreRegAlloc() {
568 if (TM->getOptLevel() != CodeGenOptLevel::None) {
570 // Add Zilsd pre-allocation load/store optimization
572 }
573
577
578 if (TM->getOptLevel() != CodeGenOptLevel::None && CLOpts.enable_pipeliner)
579 addPass(&MachinePipelinerID);
580
582}
583
584void RISCVPassConfig::addFastRegAlloc() {
585 addPass(&InitUndefID);
587}
588
589
590void RISCVPassConfig::addPostRegAlloc() {
591 if (TM->getOptLevel() != CodeGenOptLevel::None && CLOpts.enable_copyelim)
593}
594
595bool RISCVPassConfig::addILPOpts() {
596 if (CLOpts.enable_machine_combiner)
597 addPass(&MachineCombinerID);
598
599 return true;
600}
601
606
612
615 SMDiagnostic &Error, SMRange &SourceRange) const {
616 const auto &YamlMFI =
617 static_cast<const yaml::RISCVMachineFunctionInfo &>(MFI);
618 PFS.MF.getInfo<RISCVMachineFunctionInfo>()->initializeBaseYamlFields(YamlMFI);
619 return false;
620}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static std::unique_ptr< TargetLoweringObjectFile > createTLOF(const Triple &TT)
static Reloc::Model getEffectiveRelocModel()
#define X(NUM, ENUM, NAME)
Definition ELF.h:857
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Provides analysis for continuously CSEing during GISel passes.
#define LLVM_ABI
Definition Compiler.h:215
#define LLVM_EXTERNAL_VISIBILITY
Definition Compiler.h:132
This file declares the IRTranslator pass.
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Register Reg
Register const TargetRegisterInfo * TRI
#define T
LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializeRISCVTarget()
This file defines a TargetTransformInfoImplBase conforming object specific to the RISC-V target machi...
This file describes the interface of the MachineFunctionPass responsible for assigning the generic vi...
const GCNTargetMachine & getTM(const GCNSubtarget *STI)
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static FunctionPass * useDefaultRegisterAllocator()
-regalloc=... command line option.
Target-Independent Code Generator Pass Configuration Options pass.
This pass exposes codegen information to IR-level passes.
static std::unique_ptr< TargetLoweringObjectFile > createTLOF()
Functions, function parameters, and return types can have attributes to indicate how they should be t...
Definition Attributes.h:106
LLVM_ABI std::optional< unsigned > getVScaleRangeMax() const
Returns the maximum value for the vscale_range attribute or std::nullopt when unknown.
LLVM_ABI unsigned getVScaleRangeMin() const
Returns the minimum value for the vscale_range attribute.
LLVM_ABI StringRef getValueAsString() const
Return the attribute's value as a string.
bool isValid() const
Return true if the attribute is any kind of attribute.
Definition Attributes.h:266
CodeGenTargetMachineImpl(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, Reloc::Model RM, CodeModel::Model CM, CodeGenOptLevel OL)
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
FunctionPass class - This class is used to implement most global optimizations.
Definition Pass.h:314
Module * getParent()
Get the module that this global value is contained inside of...
This pass is responsible for selecting generic machine instructions to target-specific instructions.
Function & getFunction()
Return the LLVM function that this machine code represents.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
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.
Definition Module.cpp:358
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
RISCVMachineFunctionInfo - This class is derived from MachineFunctionInfo and contains private RISCV-...
yaml::MachineFunctionInfo * createDefaultFuncInfoYAML() const override
Allocate and return a default initialized instance of the YAML representation for the MachineFunction...
RISCVTargetMachine(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, std::optional< Reloc::Model > RM, std::optional< CodeModel::Model > CM, CodeGenOptLevel OL, bool JIT)
TargetPassConfig * createPassConfig(PassManagerBase &PM) override
Create a pass configuration object to be used by addPassToEmitX methods for generating a pipeline of ...
TargetTransformInfo getTargetTransformInfo(const Function &F) const override
Get a TargetTransformInfo implementation for the target.
bool isNoopAddrSpaceCast(const DataLayout &DL, unsigned SrcAS, unsigned DstAS) const override
Returns true if a cast between SrcAS and DestAS is a noop.
ScheduleDAGInstrs * createMachineScheduler(MachineSchedContext *C) const override
Create an instance of ScheduleDAGInstrs to be run within the standard MachineScheduler pass for this ...
ScheduleDAGInstrs * createPostMachineScheduler(MachineSchedContext *C) const override
Similar to createMachineScheduler but used when postRA machine scheduling is enabled.
MachineFunctionInfo * createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F, const TargetSubtargetInfo *STI) const override
Create the target's instance of MachineFunctionInfo.
yaml::MachineFunctionInfo * convertFuncInfoToYAML(const MachineFunction &MF) const override
Allocate and initialize an instance of the YAML representation of the MachineFunctionInfo.
bool parseMachineFunctionInfo(const yaml::MachineFunctionInfo &, PerFunctionMIParsingState &PFS, SMDiagnostic &Error, SMRange &SourceRange) const override
Parse out the target's MachineFunctionInfo from the YAML reprsentation.
const RISCVSubtarget * getSubtargetImpl() const =delete
This pass implements the reg bank selector pass used in the GlobalISel pipeline.
RegisterPassParser class - Handle the addition of new machine passes.
RegisterRegAllocBase class - Track the registration of register allocators.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
Instances of this class encapsulate one diagnostic report, allowing printing to a raw_ostream as a ca...
Definition SourceMgr.h:305
Represents a range in source code.
Definition SMLoc.h:47
A ScheduleDAG for scheduling lists of MachineInstr.
ScheduleDAGMILive is an implementation of ScheduleDAGInstrs that schedules machine instructions while...
ScheduleDAGMI is an implementation of ScheduleDAGInstrs that simply schedules machine instructions ac...
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
std::string str() const
Get the contents as an std::string.
Definition StringRef.h:222
CodeGenOptLevel getOptLevel() const
Returns the optimization level: None, Less, Default, or Aggressive.
void setSupportsDebugEntryValues(bool Enable)
Triple TargetTriple
Triple string, CPU name, and target feature strings the TargetMachine instance is created with.
void setMachineOutliner(bool Enable)
void setCFIFixup(bool Enable)
void setSupportsDefaultOutlining(bool Enable)
StringRef getTargetABIName(const Module &M) const
Returns the effective target ABI name: the "target-abi" module flag if present, otherwise the -target...
const DataLayout DL
DataLayout for the target: keep ABI type size and alignment.
std::unique_ptr< const MCSubtargetInfo > STI
TargetOptions Options
Target-Independent Code Generator Pass Configuration Options.
virtual void addCodeGenPrepare()
Add pass to prepare the LLVM IR for code generation.
virtual bool addRegAssignAndRewriteFast()
Add core register allocator passes which do the actual register assignment and rewriting.
virtual void addIRPasses()
Add common target configurable passes that perform LLVM IR to IR transforms following machine indepen...
virtual void addFastRegAlloc()
addFastRegAlloc - Add the minimum set of target-independent passes that are required for fast registe...
virtual void addMachineSSAOptimization()
addMachineSSAOptimization - Add standard passes that optimize machine instructions in SSA form.
virtual bool addRegAssignAndRewriteOptimized()
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
TargetSubtargetInfo - Generic base class for all target subtargets.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
PassManagerBase - An abstract interface to allow code to add passes to a pass manager without having ...
Registers T::Global with cl::ParseCommandLineOptions.
A raw_ostream that writes to an SmallVector or SmallString.
static constexpr unsigned RVVBitsPerBlock
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
ScheduleDAGMILive * createSchedLive(MachineSchedContext *C)
Create the standard converging machine scheduler.
FunctionPass * createRISCVLandingPadSetupPass()
FunctionPass * createRISCVVectorPeepholeLegacyPass()
FunctionPass * createRISCVLoadStoreOptPass()
LLVM_ABI FunctionPass * createFastRegisterAllocator()
FastRegisterAllocation Pass - This pass register allocates as fast as possible.
void initializeRISCVFoldMemOffsetLegacyPass(PassRegistry &)
LLVM_ABI char & EarlyMachineLICMID
This pass performs loop invariant code motion on machine instructions.
void initializeRISCVPushPopOptPass(PassRegistry &)
FunctionPass * createRISCVMoveMergePass()
createRISCVMoveMergePass - returns an instance of the move merge pass.
LLVM_ABI char & InitUndefID
LLVM_ABI std::unique_ptr< ScheduleDAGMutation > createMacroFusionDAGMutation(ArrayRef< MacroFusionPredTy > Predicates, bool BranchOnly=false)
Create a DAG scheduling mutation to pair instructions back to back for instructions that benefit acco...
LLVM_ABI FunctionPass * createTypePromotionLegacyPass()
Create IR Type Promotion pass.
void initializeRISCVDeadRegisterDefinitionsPass(PassRegistry &)
LLVM_ABI FunctionPass * createGreedyRegisterAllocator()
Greedy register allocation pass - This pass implements a global register allocator for optimized buil...
void initializeRISCVPreLegalizerCombinerPass(PassRegistry &)
FunctionPass * createRISCVCodeGenPrepareLegacyPass()
FunctionPass * createRISCVISelDagLegacyPass(RISCVTargetMachine &TM, CodeGenOptLevel OptLevel)
FunctionPass * createRISCVOptWInstrsLegacyPass()
LLVM_ABI FunctionPass * createSelectOptimizePass()
This pass converts conditional moves to conditional jumps when profitable.
LLVM_ABI Pass * createGlobalMergePass(const TargetMachine *TM, unsigned MaximalOffset, bool OnlyOptimizeForSize=false, bool MergeExternalByDefault=false, bool MergeConstantByDefault=false, bool MergeConstAggressiveByDefault=false)
GlobalMerge - This pass merges internal (by default) globals into structs to enable reuse of a base p...
LLVM_ABI std::unique_ptr< ScheduleDAGMutation > createLoadClusterDAGMutation(const TargetInstrInfo *TII, bool ReorderWhileClustering=false)
If ReorderWhileClustering is set to true, no attempt will be made to reduce reordering due to store c...
FunctionPass * createRISCVInsertReadWriteCSRPass()
Target & getTheRISCV32Target()
void initializeRISCVInsertVSETVLIPass(PassRegistry &)
FunctionPass * createRISCVGatherScatterLoweringLegacyPass()
LLVM_ABI char & PostRASchedulerID
PostRAScheduler - This pass performs post register allocation scheduling.
void initializeRISCVExpandPseudoPreEmitLegacyPass(PassRegistry &)
void initializeRISCVLateBranchOptPass(PassRegistry &)
FunctionPass * createRISCVExpandPseudoPostRALegacyPass()
FunctionPass * createRISCVExpandPseudoAtomicsLegacyPass()
void initializeRISCVRedundantCopyEliminationPass(PassRegistry &)
Target & getTheRISCV64beTarget()
FunctionPass * createRISCVZacasABIFixLegacyPass()
LLVM_ABI std::unique_ptr< CSEConfigBase > getStandardCSEConfigForOpt(CodeGenOptLevel Level)
Definition CSEInfo.cpp:85
FunctionPass * createRISCVDeadRegisterDefinitionsPass()
LLVM_ABI char & PostMachineSchedulerID
PostMachineScheduler - This pass schedules machine instructions postRA.
LLVM_ABI std::unique_ptr< ScheduleDAGMutation > createStoreClusterDAGMutation(const TargetInstrInfo *TII, bool ReorderWhileClustering=false)
If ReorderWhileClustering is set to true, no attempt will be made to reduce reordering due to store c...
void initializeRISCVCodeGenPrepareLegacyPass(PassRegistry &)
LLVM_ABI FunctionPass * createCFIInstrInserterLegacy()
Creates CFI Instruction Inserter pass.
FunctionPass * createRISCVMergeBaseOffsetOptPass()
Returns an instance of the Merge Base Offset Optimization pass.
FunctionPass * createRISCVPostLegalizerCombiner()
LLVM_ABI void initializeMachineKCFILegacyPass(PassRegistry &)
LLVM_ABI char & MachineCombinerID
This pass performs instruction combining using trace metrics to estimate critical-path and resource d...
LLVM_ABI FunctionPass * createUnpackMachineBundlesLegacy(std::function< bool(const MachineFunction &)> Ftor)
static Reloc::Model getEffectiveRelocModel(std::optional< Reloc::Model > RM)
CodeModel::Model getEffectiveCodeModel(std::optional< CodeModel::Model > CM, CodeModel::Model Default)
Helper method for getting the code model, returning Default if CM does not have a value.
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:280
void initializeRISCVExpandPseudoAtomicsLegacyPass(PassRegistry &)
ScheduleDAGMI * createSchedPostRA(MachineSchedContext *C)
Create a generic scheduler with no vreg liveness or DAG mutation passes.
LLVM_ABI char & BranchRelaxationPassID
BranchRelaxation - This pass replaces branches that need to jump further than is supported by a branc...
FunctionPass * createRISCVExpandPseudoPreEmitLegacyPass()
void initializeRISCVDAGToDAGISelLegacyPass(PassRegistry &)
FunctionPass * createRISCVPreAllocZilsdOptPass()
FunctionPass * createRISCVPushPopOptimizationPass()
createRISCVPushPopOptimizationPass - returns an instance of the Push/Pop optimization pass.
FunctionPass * createRISCVFoldMemOffsetLegacyPass()
FunctionPass * createRISCVMakeCompressibleOptPass()
Returns an instance of the Make Compressible Optimization pass.
FunctionPass * createRISCVRedundantCopyEliminationPass()
LLVM_ABI FunctionPass * createKCFIPass()
Lowers KCFI operand bundles for indirect calls.
Definition KCFI.cpp:75
void initializeRISCVVMV0EliminationPass(PassRegistry &)
void initializeRISCVInsertWriteVXRMPass(PassRegistry &)
void initializeRISCVLoadStoreOptPass(PassRegistry &)
LLVM_ABI FunctionPass * createLoopDataPrefetchPass()
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
void initializeRISCVInsertReadWriteCSRPass(PassRegistry &)
FunctionPass * createRISCVPreLegalizerCombiner()
FunctionPass * createRISCVVMV0EliminationPass()
void initializeRISCVExpandPseudoPreRALegacyPass(PassRegistry &)
FunctionPass * createRISCVInsertVSETVLIPass()
Returns an instance of the Insert VSETVLI pass.
FunctionPass * createRISCVO0PreLegalizerCombiner()
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:227
@ Default
-O2, -Os, -Oz
Definition CodeGen.h:230
void initializeRISCVVLOptimizerLegacyPass(PassRegistry &)
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
FunctionPass * createRISCVIndirectBranchTrackingPass()
@ Global
Append to llvm.global_dtors.
LLVM_ABI FunctionPass * createInterleavedAccessPass()
InterleavedAccess Pass - This pass identifies and matches interleaved memory accesses to target speci...
std::unique_ptr< ScheduleDAGMutation > createRISCVVectorMaskDAGMutation(const TargetRegisterInfo *TRI)
LLVM_ABI FunctionPass * createBasicRegisterAllocator()
BasicRegisterAllocation Pass - This pass implements a degenerate global register allocator using the ...
LLVM_ABI void initializeGlobalISel(PassRegistry &)
Initialize all passes linked into the GlobalISel library.
void initializeRISCVMakeCompressibleOptPass(PassRegistry &)
void initializeRISCVVectorPeepholeLegacyPass(PassRegistry &)
LLVM_ABI char & MachinePipelinerID
This pass performs software pipelining on machine instructions.
LLVM_ABI ModulePass * createBarrierNoopPass()
createBarrierNoopPass - This pass is purely a module pass barrier in a pass manager.
void initializeRISCVQCRelaxMarkingPass(PassRegistry &)
FunctionPass * createRISCVLateBranchOptPass()
Target & getTheRISCV64Target()
FunctionPass * createRISCVExpandPseudoPreRALegacyPass()
ModulePass * createRISCVPromoteConstantPass()
void call_once(once_flag &flag, Function &&F, Args &&... ArgList)
Execute the function specified as a parameter once.
Definition Threading.h:86
void initializeRISCVO0PreLegalizerCombinerPass(PassRegistry &)
void initializeRISCVMergeBaseOffsetOptPass(PassRegistry &)
void initializeRISCVIndirectBranchTrackingPass(PassRegistry &)
void initializeRISCVPromoteConstantPass(PassRegistry &)
void initializeRISCVAsmPrinterPass(PassRegistry &)
void initializeRISCVOptWInstrsLegacyPass(PassRegistry &)
void initializeRISCVGatherScatterLoweringLegacyPass(PassRegistry &)
void initializeRISCVZacasABIFixLegacyPass(PassRegistry &)
LLVM_ABI FunctionPass * createVirtRegRewriter(bool ClearVirtRegs=true)
constexpr bool valueOr(BoolOrDefault X, bool Default)
LLVM_ABI FunctionPass * createAtomicExpandLegacyPass()
AtomicExpandPass - At IR level this pass replace atomic instructions with __atomic_* library calls,...
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Definition Allocator.h:391
T bit_floor(T Value)
Returns the largest integral power of two no greater than Value if Value is nonzero.
Definition bit.h:347
FunctionPass * createRISCVInsertWriteVXRMPass()
LLVM_ABI MachineFunctionPass * createMachineCopyPropagationPass(bool UseCopyInstr)
FunctionPass * createRISCVVLOptimizerLegacyPass()
void initializeRISCVExpandPseudoPostRALegacyPass(PassRegistry &)
void initializeRISCVPreAllocZilsdOptPass(PassRegistry &)
Target & getTheRISCV32beTarget()
void initializeRISCVPostLegalizerCombinerPass(PassRegistry &)
void initializeRISCVMoveMergePass(PassRegistry &)
FunctionPass * createRISCVQCRelaxMarkingPass()
MCRegisterClass TargetRegisterClass
Definition FastISel.h:58
#define N
MachineFunctionInfo - This class can be derived from and used by targets to hold private target-speci...
static FuncInfoTy * create(BumpPtrAllocator &Allocator, const Function &F, const SubtargetTy *STI)
Factory function: default behavior is to call new using the supplied allocator.
MachineSchedContext provides enough context from the MachineScheduler pass for the target to instanti...
static bool isRVVRegClass(const TargetRegisterClass *RC)
RegisterTargetMachine - Helper template for registering a target machine implementation,...
The llvm::once_flag structure.
Definition Threading.h:67
Targets should override this in a way that mirrors the implementation of llvm::MachineFunctionInfo.