LLVM 22.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"
15#include "RISCV.h"
30#include "llvm/CodeGen/Passes.h"
39#include "llvm/Transforms/IPO.h"
42#include <optional>
43using namespace llvm;
44
46 "riscv-enable-copyelim",
47 cl::desc("Enable the redundant copy elimination pass"), cl::init(true),
49
50// FIXME: Unify control over GlobalMerge.
52 EnableGlobalMerge("riscv-enable-global-merge", cl::Hidden,
53 cl::desc("Enable the global merge pass"));
54
55static cl::opt<bool>
56 EnableMachineCombiner("riscv-enable-machine-combiner",
57 cl::desc("Enable the machine combiner pass"),
58 cl::init(true), cl::Hidden);
59
61 "riscv-v-vector-bits-max",
62 cl::desc("Assume V extension vector registers are at most this big, "
63 "with zero meaning no maximum size is assumed."),
65
67 "riscv-v-vector-bits-min",
68 cl::desc("Assume V extension vector registers are at least this big, "
69 "with zero meaning no minimum size is assumed. A value of -1 "
70 "means use Zvl*b extension. This is primarily used to enable "
71 "autovectorization with fixed width vectors."),
72 cl::init(-1), cl::Hidden);
73
75 "riscv-enable-copy-propagation",
76 cl::desc("Enable the copy propagation with RISC-V copy instr"),
77 cl::init(true), cl::Hidden);
78
80 "riscv-enable-dead-defs", cl::Hidden,
81 cl::desc("Enable the pass that removes dead"
82 " definitions and replaces stores to"
83 " them with stores to x0"),
84 cl::init(true));
85
86static cl::opt<bool>
87 EnableSinkFold("riscv-enable-sink-fold",
88 cl::desc("Enable sinking and folding of instruction copies"),
89 cl::init(true), cl::Hidden);
90
91static cl::opt<bool>
92 EnableLoopDataPrefetch("riscv-enable-loop-data-prefetch", cl::Hidden,
93 cl::desc("Enable the loop data prefetch pass"),
94 cl::init(true));
95
97 "riscv-disable-vector-mask-mutation",
98 cl::desc("Disable the vector mask scheduling mutation"), cl::init(false),
100
101static cl::opt<bool>
102 EnableMachinePipeliner("riscv-enable-pipeliner",
103 cl::desc("Enable Machine Pipeliner for RISC-V"),
104 cl::init(false), cl::Hidden);
105
107 "riscv-enable-cfi-instr-inserter",
108 cl::desc("Enable CFI Instruction Inserter for RISC-V"), cl::init(false),
109 cl::Hidden);
110
149}
150
151static Reloc::Model getEffectiveRelocModel(std::optional<Reloc::Model> RM) {
152 return RM.value_or(Reloc::Static);
153}
154
155static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) {
156 if (TT.isOSBinFormatMachO())
157 return std::make_unique<RISCVMachOTargetObjectFile>();
158 return std::make_unique<RISCVELFTargetObjectFile>();
159}
160
162 StringRef CPU, StringRef FS,
163 const TargetOptions &Options,
164 std::optional<Reloc::Model> RM,
165 std::optional<CodeModel::Model> CM,
166 CodeGenOptLevel OL, bool JIT)
168 T, TT.computeDataLayout(Options.MCOptions.getABIName()), TT, CPU, FS,
170 getEffectiveCodeModel(CM, CodeModel::Small), OL),
171 TLOF(createTLOF(TT)) {
172 initAsmInfo();
173
174 // RISC-V supports the MachineOutliner.
175 setMachineOutliner(true);
177
178 // RISC-V supports the debug entry values.
180
181 if (TT.isOSFuchsia() && !TT.isArch64Bit())
182 report_fatal_error("Fuchsia is only supported for 64-bit");
183
185}
186
187const RISCVSubtarget *
189 Attribute CPUAttr = F.getFnAttribute("target-cpu");
190 Attribute TuneAttr = F.getFnAttribute("tune-cpu");
191 Attribute FSAttr = F.getFnAttribute("target-features");
192
193 std::string CPU =
194 CPUAttr.isValid() ? CPUAttr.getValueAsString().str() : TargetCPU;
195 std::string TuneCPU =
196 TuneAttr.isValid() ? TuneAttr.getValueAsString().str() : CPU;
197 std::string FS =
198 FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS;
199
200 unsigned RVVBitsMin = RVVVectorBitsMinOpt;
201 unsigned RVVBitsMax = RVVVectorBitsMaxOpt;
202
203 Attribute VScaleRangeAttr = F.getFnAttribute(Attribute::VScaleRange);
204 if (VScaleRangeAttr.isValid()) {
205 if (!RVVVectorBitsMinOpt.getNumOccurrences())
206 RVVBitsMin = VScaleRangeAttr.getVScaleRangeMin() * RISCV::RVVBitsPerBlock;
207 std::optional<unsigned> VScaleMax = VScaleRangeAttr.getVScaleRangeMax();
208 if (VScaleMax.has_value() && !RVVVectorBitsMaxOpt.getNumOccurrences())
209 RVVBitsMax = *VScaleMax * RISCV::RVVBitsPerBlock;
210 }
211
212 if (RVVBitsMin != -1U) {
213 // FIXME: Change to >= 32 when VLEN = 32 is supported.
214 assert((RVVBitsMin == 0 || (RVVBitsMin >= 64 && RVVBitsMin <= 65536 &&
215 isPowerOf2_32(RVVBitsMin))) &&
216 "V or Zve* extension requires vector length to be in the range of "
217 "64 to 65536 and a power 2!");
218 assert((RVVBitsMax >= RVVBitsMin || RVVBitsMax == 0) &&
219 "Minimum V extension vector length should not be larger than its "
220 "maximum!");
221 }
222 assert((RVVBitsMax == 0 || (RVVBitsMax >= 64 && RVVBitsMax <= 65536 &&
223 isPowerOf2_32(RVVBitsMax))) &&
224 "V or Zve* extension requires vector length to be in the range of "
225 "64 to 65536 and a power 2!");
226
227 if (RVVBitsMin != -1U) {
228 if (RVVBitsMax != 0) {
229 RVVBitsMin = std::min(RVVBitsMin, RVVBitsMax);
230 RVVBitsMax = std::max(RVVBitsMin, RVVBitsMax);
231 }
232
233 RVVBitsMin = llvm::bit_floor(
234 (RVVBitsMin < 64 || RVVBitsMin > 65536) ? 0 : RVVBitsMin);
235 }
236 RVVBitsMax =
237 llvm::bit_floor((RVVBitsMax < 64 || RVVBitsMax > 65536) ? 0 : RVVBitsMax);
238
240 raw_svector_ostream(Key) << "RVVMin" << RVVBitsMin << "RVVMax" << RVVBitsMax
241 << CPU << TuneCPU << FS;
242 auto &I = SubtargetMap[Key];
243 if (!I) {
244 // This needs to be done before we create a new subtarget since any
245 // creation will depend on the TM and the code generation flags on the
246 // function that reside in TargetOptions.
248 auto ABIName = Options.MCOptions.getABIName();
249 if (const MDString *ModuleTargetABI = dyn_cast_or_null<MDString>(
250 F.getParent()->getModuleFlag("target-abi"))) {
251 auto TargetABI = RISCVABI::getTargetABI(ABIName);
252 if (TargetABI != RISCVABI::ABI_Unknown &&
253 ModuleTargetABI->getString() != ABIName) {
254 report_fatal_error("-target-abi option != target-abi module flag");
255 }
256 ABIName = ModuleTargetABI->getString();
257 }
258 I = std::make_unique<RISCVSubtarget>(
259 TargetTriple, CPU, TuneCPU, FS, ABIName, RVVBitsMin, RVVBitsMax, *this);
260 }
261 return I.get();
262}
263
270
273 return TargetTransformInfo(std::make_unique<RISCVTTIImpl>(this, F));
274}
275
276// A RISC-V hart has a single byte-addressable address space of 2^XLEN bytes
277// for all memory accesses, so it is reasonable to assume that an
278// implementation has no-op address space casts. If an implementation makes a
279// change to this, they can override it here.
281 unsigned DstAS) const {
282 return true;
283}
284
287 const RISCVSubtarget &ST = C->MF->getSubtarget<RISCVSubtarget>();
289
290 if (ST.enableMISchedLoadClustering())
291 DAG->addMutation(createLoadClusterDAGMutation(
292 DAG->TII, DAG->TRI, /*ReorderWhileClustering=*/true));
293
294 if (ST.enableMISchedStoreClustering())
295 DAG->addMutation(createStoreClusterDAGMutation(
296 DAG->TII, DAG->TRI, /*ReorderWhileClustering=*/true));
297
298 if (!DisableVectorMaskMutation && ST.hasVInstructions())
299 DAG->addMutation(createRISCVVectorMaskDAGMutation(DAG->TRI));
300
301 return DAG;
302}
303
306 const RISCVSubtarget &ST = C->MF->getSubtarget<RISCVSubtarget>();
308
309 if (ST.enablePostMISchedLoadClustering())
310 DAG->addMutation(createLoadClusterDAGMutation(
311 DAG->TII, DAG->TRI, /*ReorderWhileClustering=*/true));
312
313 if (ST.enablePostMISchedStoreClustering())
314 DAG->addMutation(createStoreClusterDAGMutation(
315 DAG->TII, DAG->TRI, /*ReorderWhileClustering=*/true));
316
317 return DAG;
318}
319
320namespace {
321
322class RVVRegisterRegAlloc : public RegisterRegAllocBase<RVVRegisterRegAlloc> {
323public:
324 RVVRegisterRegAlloc(const char *N, const char *D, FunctionPassCtor C)
325 : RegisterRegAllocBase(N, D, C) {}
326};
327
328static bool onlyAllocateRVVReg(const TargetRegisterInfo &TRI,
330 const Register Reg) {
331 const TargetRegisterClass *RC = MRI.getRegClass(Reg);
333}
334
335static FunctionPass *useDefaultRegisterAllocator() { return nullptr; }
336
337static llvm::once_flag InitializeDefaultRVVRegisterAllocatorFlag;
338
339/// -riscv-rvv-regalloc=<fast|basic|greedy> command line option.
340/// This option could designate the rvv register allocator only.
341/// For example: -riscv-rvv-regalloc=basic
342static cl::opt<RVVRegisterRegAlloc::FunctionPassCtor, false,
344 RVVRegAlloc("riscv-rvv-regalloc", cl::Hidden,
346 cl::desc("Register allocator to use for RVV register."));
347
348static void initializeDefaultRVVRegisterAllocatorOnce() {
349 RegisterRegAlloc::FunctionPassCtor Ctor = RVVRegisterRegAlloc::getDefault();
350
351 if (!Ctor) {
352 Ctor = RVVRegAlloc;
353 RVVRegisterRegAlloc::setDefault(RVVRegAlloc);
354 }
355}
356
357static FunctionPass *createBasicRVVRegisterAllocator() {
358 return createBasicRegisterAllocator(onlyAllocateRVVReg);
359}
360
361static FunctionPass *createGreedyRVVRegisterAllocator() {
362 return createGreedyRegisterAllocator(onlyAllocateRVVReg);
363}
364
365static FunctionPass *createFastRVVRegisterAllocator() {
366 return createFastRegisterAllocator(onlyAllocateRVVReg, false);
367}
368
369static RVVRegisterRegAlloc basicRegAllocRVVReg("basic",
370 "basic register allocator",
371 createBasicRVVRegisterAllocator);
372static RVVRegisterRegAlloc
373 greedyRegAllocRVVReg("greedy", "greedy register allocator",
374 createGreedyRVVRegisterAllocator);
375
376static RVVRegisterRegAlloc fastRegAllocRVVReg("fast", "fast register allocator",
377 createFastRVVRegisterAllocator);
378
379class RISCVPassConfig : public TargetPassConfig {
380public:
381 RISCVPassConfig(RISCVTargetMachine &TM, PassManagerBase &PM)
382 : TargetPassConfig(TM, PM) {
383 if (TM.getOptLevel() != CodeGenOptLevel::None)
384 substitutePass(&PostRASchedulerID, &PostMachineSchedulerID);
385 setEnableSinkAndFold(EnableSinkFold);
386 EnableLoopTermFold = true;
387 }
388
389 RISCVTargetMachine &getRISCVTargetMachine() const {
391 }
392
393 void addIRPasses() override;
394 bool addPreISel() override;
395 void addCodeGenPrepare() override;
396 bool addInstSelector() override;
397 bool addIRTranslator() override;
398 void addPreLegalizeMachineIR() override;
399 bool addLegalizeMachineIR() override;
400 void addPreRegBankSelect() override;
401 bool addRegBankSelect() override;
402 bool addGlobalInstructionSelect() override;
403 void addPreEmitPass() override;
404 void addPreEmitPass2() override;
405 void addPreSched2() override;
406 void addMachineSSAOptimization() override;
407 FunctionPass *createRVVRegAllocPass(bool Optimized);
408 bool addRegAssignAndRewriteFast() override;
409 bool addRegAssignAndRewriteOptimized() override;
410 void addPreRegAlloc() override;
411 void addPostRegAlloc() override;
412 void addFastRegAlloc() override;
413 bool addILPOpts() override;
414
415 std::unique_ptr<CSEConfigBase> getCSEConfig() const override;
416};
417} // namespace
418
420 return new RISCVPassConfig(*this, PM);
421}
422
423std::unique_ptr<CSEConfigBase> RISCVPassConfig::getCSEConfig() const {
424 return getStandardCSEConfigForOpt(TM->getOptLevel());
425}
426
427FunctionPass *RISCVPassConfig::createRVVRegAllocPass(bool Optimized) {
428 // Initialize the global default.
429 llvm::call_once(InitializeDefaultRVVRegisterAllocatorFlag,
430 initializeDefaultRVVRegisterAllocatorOnce);
431
432 RegisterRegAlloc::FunctionPassCtor Ctor = RVVRegisterRegAlloc::getDefault();
433 if (Ctor != useDefaultRegisterAllocator)
434 return Ctor();
435
436 if (Optimized)
437 return createGreedyRVVRegisterAllocator();
438
439 return createFastRVVRegisterAllocator();
440}
441
442bool RISCVPassConfig::addRegAssignAndRewriteFast() {
443 addPass(createRVVRegAllocPass(false));
445 if (TM->getOptLevel() != CodeGenOptLevel::None &&
449}
450
451bool RISCVPassConfig::addRegAssignAndRewriteOptimized() {
452 addPass(createRVVRegAllocPass(true));
453 addPass(createVirtRegRewriter(false));
455 if (TM->getOptLevel() != CodeGenOptLevel::None &&
459}
460
461void RISCVPassConfig::addIRPasses() {
464
465 if (getOptLevel() != CodeGenOptLevel::None) {
468
472 }
473
475}
476
477bool RISCVPassConfig::addPreISel() {
478 if (TM->getOptLevel() != CodeGenOptLevel::None)
480 if (TM->getOptLevel() != CodeGenOptLevel::None) {
481 // Add a barrier before instruction selection so that we will not get
482 // deleted block address after enabling default outlining. See D99707 for
483 // more details.
484 addPass(createBarrierNoopPass());
485 }
486
487 if ((TM->getOptLevel() != CodeGenOptLevel::None &&
490 // FIXME: Like AArch64, we disable extern global merging by default due to
491 // concerns it might regress some workloads. Unlike AArch64, we don't
492 // currently support enabling the pass in an "OnlyOptimizeForSize" mode.
493 // Investigating and addressing both items are TODO.
494 addPass(createGlobalMergePass(TM, /* MaxOffset */ 2047,
495 /* OnlyOptimizeForSize */ false,
496 /* MergeExternalByDefault */ true));
497 }
498
499 return false;
500}
501
502void RISCVPassConfig::addCodeGenPrepare() {
503 if (getOptLevel() != CodeGenOptLevel::None)
506}
507
508bool RISCVPassConfig::addInstSelector() {
509 addPass(createRISCVISelDag(getRISCVTargetMachine(), getOptLevel()));
510
511 return false;
512}
513
514bool RISCVPassConfig::addIRTranslator() {
515 addPass(new IRTranslator(getOptLevel()));
516 return false;
517}
518
519void RISCVPassConfig::addPreLegalizeMachineIR() {
520 if (getOptLevel() == CodeGenOptLevel::None) {
522 } else {
524 }
525}
526
527bool RISCVPassConfig::addLegalizeMachineIR() {
528 addPass(new Legalizer());
529 return false;
530}
531
532void RISCVPassConfig::addPreRegBankSelect() {
533 if (getOptLevel() != CodeGenOptLevel::None)
535}
536
537bool RISCVPassConfig::addRegBankSelect() {
538 addPass(new RegBankSelect());
539 return false;
540}
541
542bool RISCVPassConfig::addGlobalInstructionSelect() {
543 addPass(new InstructionSelect(getOptLevel()));
544 return false;
545}
546
547void RISCVPassConfig::addPreSched2() {
549
550 // Emit KCFI checks for indirect calls.
551 addPass(createKCFIPass());
552 if (TM->getOptLevel() != CodeGenOptLevel::None)
554}
555
556void RISCVPassConfig::addPreEmitPass() {
557 // TODO: It would potentially be better to schedule copy propagation after
558 // expanding pseudos (in addPreEmitPass2). However, performing copy
559 // propagation after the machine outliner (which runs after addPreEmitPass)
560 // currently leads to incorrect code-gen, where copies to registers within
561 // outlined functions are removed erroneously.
562 if (TM->getOptLevel() >= CodeGenOptLevel::Default &&
565 if (TM->getOptLevel() >= CodeGenOptLevel::Default)
567 // The IndirectBranchTrackingPass inserts lpad and could have changed the
568 // basic block alignment. It must be done before Branch Relaxation to
569 // prevent the adjusted offset exceeding the branch range.
571 addPass(&BranchRelaxationPassID);
573}
574
575void RISCVPassConfig::addPreEmitPass2() {
576 if (TM->getOptLevel() != CodeGenOptLevel::None) {
577 addPass(createRISCVMoveMergePass());
578 // Schedule PushPop Optimization before expansion of Pseudo instruction,
579 // ensuring return instruction is detected correctly.
581 }
583
584 // Schedule the expansion of AMOs at the last possible moment, avoiding the
585 // possibility for other passes to break the requirements for forward
586 // progress in the LR/SC block.
588
589 // KCFI indirect call checks are lowered to a bundle.
590 addPass(createUnpackMachineBundles([&](const MachineFunction &MF) {
591 return MF.getFunction().getParent()->getModuleFlag("kcfi");
592 }));
593
595 addPass(createCFIInstrInserter());
596}
597
598void RISCVPassConfig::addMachineSSAOptimization() {
601
603
604 if (TM->getTargetTriple().isRISCV64()) {
605 addPass(createRISCVOptWInstrsPass());
606 }
607}
608
609void RISCVPassConfig::addPreRegAlloc() {
611 if (TM->getOptLevel() != CodeGenOptLevel::None) {
614 // Add Zilsd pre-allocation load/store optimization
616 }
617
621
622 if (TM->getOptLevel() != CodeGenOptLevel::None && EnableMachinePipeliner)
623 addPass(&MachinePipelinerID);
624
626}
627
628void RISCVPassConfig::addFastRegAlloc() {
629 addPass(&InitUndefID);
631}
632
633
634void RISCVPassConfig::addPostRegAlloc() {
635 if (TM->getOptLevel() != CodeGenOptLevel::None &&
638}
639
640bool RISCVPassConfig::addILPOpts() {
642 addPass(&MachineCombinerID);
643
644 return true;
645}
646
648#define GET_PASS_REGISTRY "RISCVPassRegistry.def"
650
651 PB.registerLateLoopOptimizationsEPCallback([=](LoopPassManager &LPM,
652 OptimizationLevel Level) {
653 if (Level != OptimizationLevel::O0)
655 });
656}
657
662
668
671 SMDiagnostic &Error, SMRange &SourceRange) const {
672 const auto &YamlMFI =
673 static_cast<const yaml::RISCVMachineFunctionInfo &>(MFI);
674 PFS.MF.getInfo<RISCVMachineFunctionInfo>()->initializeBaseYamlFields(YamlMFI);
675 return false;
676}
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static cl::opt< bool > EnableSinkFold("aarch64-enable-sink-fold", cl::desc("Enable sinking and folding of instruction copies"), cl::init(true), cl::Hidden)
static cl::opt< bool > EnableRedundantCopyElimination("aarch64-enable-copyelim", cl::desc("Enable the redundant copy elimination pass"), cl::init(true), cl::Hidden)
static cl::opt< bool > EnableLoopDataPrefetch("aarch64-enable-loop-data-prefetch", cl::Hidden, cl::desc("Enable the loop data prefetch pass"), cl::init(true))
static cl::opt< bool > EnableMachinePipeliner("aarch64-enable-pipeliner", cl::desc("Enable Machine Pipeliner for AArch64"), cl::init(false), cl::Hidden)
static std::unique_ptr< TargetLoweringObjectFile > createTLOF(const Triple &TT)
static Reloc::Model getEffectiveRelocModel()
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:213
#define LLVM_EXTERNAL_VISIBILITY
Definition Compiler.h:132
DXIL Legalizer
static cl::opt< bool > EnableGlobalMerge("enable-global-merge", cl::Hidden, cl::desc("Enable the global merge pass"), cl::init(true))
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
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC)
static cl::opt< bool > EnableRedundantCopyElimination("riscv-enable-copyelim", cl::desc("Enable the redundant copy elimination pass"), cl::init(true), cl::Hidden)
static cl::opt< bool > EnableMachinePipeliner("riscv-enable-pipeliner", cl::desc("Enable Machine Pipeliner for RISC-V"), cl::init(false), cl::Hidden)
static cl::opt< bool > EnableSinkFold("riscv-enable-sink-fold", cl::desc("Enable sinking and folding of instruction copies"), cl::init(true), cl::Hidden)
static cl::opt< bool > EnableLoopDataPrefetch("riscv-enable-loop-data-prefetch", cl::Hidden, cl::desc("Enable the loop data prefetch pass"), cl::init(true))
static cl::opt< unsigned > RVVVectorBitsMaxOpt("riscv-v-vector-bits-max", cl::desc("Assume V extension vector registers are at most this big, " "with zero meaning no maximum size is assumed."), cl::init(0), cl::Hidden)
static cl::opt< cl::boolOrDefault > EnableGlobalMerge("riscv-enable-global-merge", cl::Hidden, cl::desc("Enable the global merge pass"))
static cl::opt< bool > EnableRISCVCopyPropagation("riscv-enable-copy-propagation", cl::desc("Enable the copy propagation with RISC-V copy instr"), cl::init(true), cl::Hidden)
static cl::opt< int > RVVVectorBitsMinOpt("riscv-v-vector-bits-min", cl::desc("Assume V extension vector registers are at least this big, " "with zero meaning no minimum size is assumed. A value of -1 " "means use Zvl*b extension. This is primarily used to enable " "autovectorization with fixed width vectors."), cl::init(-1), cl::Hidden)
static cl::opt< bool > DisableVectorMaskMutation("riscv-disable-vector-mask-mutation", cl::desc("Disable the vector mask scheduling mutation"), cl::init(false), cl::Hidden)
LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializeRISCVTarget()
static cl::opt< bool > EnableRISCVDeadRegisterElimination("riscv-enable-dead-defs", cl::Hidden, cl::desc("Enable the pass that removes dead" " definitions and replaces stores to" " them with stores to x0"), cl::init(true))
static cl::opt< bool > EnableCFIInstrInserter("riscv-enable-cfi-instr-inserter", cl::desc("Enable CFI Instruction Inserter for RISC-V"), cl::init(false), cl::Hidden)
static cl::opt< bool > EnableMachineCombiner("riscv-enable-machine-combiner", cl::desc("Enable the machine combiner pass"), cl::init(true), cl::Hidden)
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 TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
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:69
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:223
CodeGenTargetMachineImpl(const Target &T, StringRef DataLayoutString, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, Reloc::Model RM, CodeModel::Model CM, CodeGenOptLevel OL)
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.
A single uniqued string.
Definition Metadata.h:721
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,...
Metadata * getModuleFlag(StringRef Key) const
Return the corresponding value if Key appears in module flags, otherwise return null.
Definition Module.cpp:353
static LLVM_ABI const OptimizationLevel O0
Disable as many optimizations as possible.
This class provides access to building LLVM's passes.
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 ...
void registerPassBuilderCallbacks(PassBuilder &PB) override
Allow the target to modify the pass pipeline.
bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DstAS) const override
Returns true if a cast between SrcAS and DestAS is a noop.
TargetTransformInfo getTargetTransformInfo(const Function &F) const override
Get a TargetTransformInfo implementation for the target.
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:297
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
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
std::string str() const
str - Get the contents as an std::string.
Definition StringRef.h:225
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)
std::unique_ptr< const MCSubtargetInfo > STI
TargetOptions Options
void resetTargetOptions(const Function &F) const
Reset the target options based on the function's attributes.
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:47
PassManagerBase - An abstract interface to allow code to add passes to a pass manager without having ...
A raw_ostream that writes to an SmallVector or SmallString.
Interfaces for registering analysis passes, producing common pass manager configurations,...
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
ABI getTargetABI(StringRef ABIName)
static constexpr unsigned RVVBitsPerBlock
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
ScheduleDAGMILive * createSchedLive(MachineSchedContext *C)
Create the standard converging machine scheduler.
FunctionPass * createRISCVLandingPadSetupPass()
FunctionPass * createRISCVLoadStoreOptPass()
LLVM_ABI FunctionPass * createFastRegisterAllocator()
FastRegisterAllocation Pass - This pass register allocates as fast as possible.
void initializeRISCVPushPopOptPass(PassRegistry &)
void initializeRISCVExpandPseudoPass(PassRegistry &)
FunctionPass * createRISCVFoldMemOffsetPass()
FunctionPass * createRISCVMoveMergePass()
createRISCVMoveMergePass - returns an instance of the move merge pass.
LLVM_ABI char & InitUndefID
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 * createRISCVExpandAtomicPseudoPass()
FunctionPass * createRISCVPostRAExpandPseudoPass()
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...
FunctionPass * createRISCVInsertReadWriteCSRPass()
Target & getTheRISCV32Target()
void initializeRISCVFoldMemOffsetPass(PassRegistry &)
void initializeRISCVInsertVSETVLIPass(PassRegistry &)
FunctionPass * createRISCVVLOptimizerPass()
LLVM_ABI char & PostRASchedulerID
PostRAScheduler - This pass performs post register allocation scheduling.
void initializeRISCVLateBranchOptPass(PassRegistry &)
void initializeRISCVRedundantCopyEliminationPass(PassRegistry &)
Target & getTheRISCV64beTarget()
LLVM_ABI std::unique_ptr< CSEConfigBase > getStandardCSEConfigForOpt(CodeGenOptLevel Level)
Definition CSEInfo.cpp:89
FunctionPass * createRISCVDeadRegisterDefinitionsPass()
LLVM_ABI char & PostMachineSchedulerID
PostMachineScheduler - This pass schedules machine instructions postRA.
FunctionPass * createRISCVGatherScatterLoweringPass()
FunctionPass * createRISCVMergeBaseOffsetOptPass()
Returns an instance of the Merge Base Offset Optimization pass.
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
FunctionPass * createRISCVPostLegalizerCombiner()
PassManager< Loop, LoopAnalysisManager, LoopStandardAnalysisResults &, LPMUpdater & > LoopPassManager
The Loop pass manager.
LLVM_ABI char & MachineCombinerID
This pass performs instruction combining using trace metrics to estimate critical-path and resource d...
static Reloc::Model getEffectiveRelocModel(std::optional< Reloc::Model > RM)
void initializeRISCVPostRAExpandPseudoPass(PassRegistry &)
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:279
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...
void initializeRISCVDAGToDAGISelLegacyPass(PassRegistry &)
FunctionPass * createRISCVPreAllocZilsdOptPass()
FunctionPass * createRISCVPushPopOptimizationPass()
createRISCVPushPopOptimizationPass - returns an instance of the Push/Pop optimization pass.
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:61
void initializeRISCVVMV0EliminationPass(PassRegistry &)
void initializeRISCVInsertWriteVXRMPass(PassRegistry &)
void initializeRISCVLoadStoreOptPass(PassRegistry &)
LLVM_ABI std::unique_ptr< ScheduleDAGMutation > createStoreClusterDAGMutation(const TargetInstrInfo *TII, const TargetRegisterInfo *TRI, bool ReorderWhileClustering=false)
If ReorderWhileClustering is set to true, no attempt will be made to reduce reordering due to store c...
LLVM_ABI FunctionPass * createLoopDataPrefetchPass()
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:167
void initializeRISCVInsertReadWriteCSRPass(PassRegistry &)
void initializeRISCVExpandAtomicPseudoPass(PassRegistry &)
FunctionPass * createRISCVPreLegalizerCombiner()
void initializeRISCVCodeGenPrepareLegacyPassPass(PassRegistry &)
FunctionPass * createRISCVVMV0EliminationPass()
FunctionPass * createRISCVInsertVSETVLIPass()
Returns an instance of the Insert VSETVLI pass.
FunctionPass * createRISCVO0PreLegalizerCombiner()
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:82
@ Default
-O2, -Os, -Oz
Definition CodeGen.h:85
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
FunctionPass * createRISCVIndirectBranchTrackingPass()
FunctionPass * createRISCVOptWInstrsPass()
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.
LLVM_ABI void initializeKCFIPass(PassRegistry &)
void initializeRISCVMakeCompressibleOptPass(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 initializeRISCVVLOptimizerPass(PassRegistry &)
LLVM_ABI std::unique_ptr< ScheduleDAGMutation > createLoadClusterDAGMutation(const TargetInstrInfo *TII, const TargetRegisterInfo *TRI, bool ReorderWhileClustering=false)
If ReorderWhileClustering is set to true, no attempt will be made to reduce reordering due to store c...
void initializeRISCVOptWInstrsPass(PassRegistry &)
LLVM_ABI FunctionPass * createUnpackMachineBundles(std::function< bool(const MachineFunction &)> Ftor)
FunctionPass * createRISCVLateBranchOptPass()
Target & getTheRISCV64Target()
ModulePass * createRISCVPromoteConstantPass()
FunctionPass * createRISCVVectorPeepholePass()
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 &)
FunctionPass * createRISCVISelDag(RISCVTargetMachine &TM, CodeGenOptLevel OptLevel)
LLVM_ABI FunctionPass * createVirtRegRewriter(bool ClearVirtRegs=true)
void initializeRISCVGatherScatterLoweringPass(PassRegistry &)
FunctionPass * createRISCVExpandPseudoPass()
FunctionPass * createRISCVPreRAExpandPseudoPass()
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:383
T bit_floor(T Value)
Returns the largest integral power of two no greater than Value if Value is nonzero.
Definition bit.h:330
FunctionPass * createRISCVInsertWriteVXRMPass()
LLVM_ABI MachineFunctionPass * createMachineCopyPropagationPass(bool UseCopyInstr)
void initializeRISCVVectorPeepholePass(PassRegistry &)
FunctionPass * createRISCVZacasABIFixPass()
LLVM_ABI FunctionPass * createCFIInstrInserter()
Creates CFI Instruction Inserter pass.
void initializeRISCVPreRAExpandPseudoPass(PassRegistry &)
void initializeRISCVPreAllocZilsdOptPass(PassRegistry &)
Target & getTheRISCV32beTarget()
void initializeRISCVPostLegalizerCombinerPass(PassRegistry &)
void initializeRISCVMoveMergePass(PassRegistry &)
#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.