LLVM 23.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"
31#include "llvm/CodeGen/Passes.h"
40#include "llvm/Transforms/IPO.h"
43#include <optional>
44using namespace llvm;
45
47 "riscv-enable-copyelim",
48 cl::desc("Enable the redundant copy elimination pass"), cl::init(true),
50
51// FIXME: Unify control over GlobalMerge.
53 EnableGlobalMerge("riscv-enable-global-merge", cl::Hidden,
54 cl::desc("Enable the global merge pass"));
55
56static cl::opt<bool>
57 EnableMachineCombiner("riscv-enable-machine-combiner",
58 cl::desc("Enable the machine combiner pass"),
59 cl::init(true), cl::Hidden);
60
62 "riscv-v-vector-bits-max",
63 cl::desc("Assume V extension vector registers are at most this big, "
64 "with zero meaning no maximum size is assumed."),
66
68 "riscv-v-vector-bits-min",
69 cl::desc("Assume V extension vector registers are at least this big, "
70 "with zero meaning no minimum size is assumed. A value of -1 "
71 "means use Zvl*b extension. This is primarily used to enable "
72 "autovectorization with fixed width vectors."),
73 cl::init(-1), cl::Hidden);
74
76 "riscv-enable-copy-propagation",
77 cl::desc("Enable the copy propagation with RISC-V copy instr"),
78 cl::init(true), cl::Hidden);
79
81 "riscv-enable-dead-defs", cl::Hidden,
82 cl::desc("Enable the pass that removes dead"
83 " definitions and replaces stores to"
84 " them with stores to x0"),
85 cl::init(true));
86
87static cl::opt<bool>
88 EnableSinkFold("riscv-enable-sink-fold",
89 cl::desc("Enable sinking and folding of instruction copies"),
90 cl::init(true), cl::Hidden);
91
92static cl::opt<bool>
93 EnableLoopDataPrefetch("riscv-enable-loop-data-prefetch", cl::Hidden,
94 cl::desc("Enable the loop data prefetch pass"),
95 cl::init(true));
96
98 "riscv-disable-vector-mask-mutation",
99 cl::desc("Disable the vector mask scheduling mutation"), cl::init(false),
100 cl::Hidden);
101
102static cl::opt<bool>
103 EnableMachinePipeliner("riscv-enable-pipeliner",
104 cl::desc("Enable Machine Pipeliner for RISC-V"),
105 cl::init(false), cl::Hidden);
106
108 "riscv-enable-cfi-instr-inserter",
109 cl::desc("Enable CFI Instruction Inserter for RISC-V"), cl::init(false),
110 cl::Hidden);
111
112static cl::opt<bool>
113 EnableSelectOpt("riscv-select-opt", cl::Hidden,
114 cl::desc("Enable select to branch optimizations"),
115 cl::init(true));
116
156}
157
159 std::optional<Reloc::Model> RM) {
160 if (TT.isOSBinFormatMachO())
161 return RM.value_or(Reloc::PIC_);
162
163 return RM.value_or(Reloc::Static);
164}
165
166static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) {
167 if (TT.isOSBinFormatMachO())
168 return std::make_unique<RISCVMachOTargetObjectFile>();
169 return std::make_unique<RISCVELFTargetObjectFile>();
170}
171
173 StringRef CPU, StringRef FS,
174 const TargetOptions &Options,
175 std::optional<Reloc::Model> RM,
176 std::optional<CodeModel::Model> CM,
177 CodeGenOptLevel OL, bool JIT)
179 T, TT.computeDataLayout(Options.MCOptions.getABIName()), TT, CPU, FS,
181 getEffectiveCodeModel(CM, CodeModel::Small), OL),
182 TLOF(createTLOF(TT)) {
183 initAsmInfo();
184
185 // RISC-V supports the MachineOutliner.
186 setMachineOutliner(true);
188
189 // RISC-V supports the debug entry values.
191
192 if (TT.isOSFuchsia() && !TT.isArch64Bit())
193 report_fatal_error("Fuchsia is only supported for 64-bit");
194
196}
197
198const RISCVSubtarget *
200 Attribute CPUAttr = F.getFnAttribute("target-cpu");
201 Attribute TuneAttr = F.getFnAttribute("tune-cpu");
202 Attribute FSAttr = F.getFnAttribute("target-features");
203
204 std::string CPU =
205 CPUAttr.isValid() ? CPUAttr.getValueAsString().str() : TargetCPU;
206 std::string TuneCPU =
207 TuneAttr.isValid() ? TuneAttr.getValueAsString().str() : CPU;
208 std::string FS =
209 FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS;
210
211 unsigned RVVBitsMin = RVVVectorBitsMinOpt;
212 unsigned RVVBitsMax = RVVVectorBitsMaxOpt;
213
214 Attribute VScaleRangeAttr = F.getFnAttribute(Attribute::VScaleRange);
215 if (VScaleRangeAttr.isValid()) {
216 if (!RVVVectorBitsMinOpt.getNumOccurrences())
217 RVVBitsMin = VScaleRangeAttr.getVScaleRangeMin() * RISCV::RVVBitsPerBlock;
218 std::optional<unsigned> VScaleMax = VScaleRangeAttr.getVScaleRangeMax();
219 if (VScaleMax.has_value() && !RVVVectorBitsMaxOpt.getNumOccurrences())
220 RVVBitsMax = *VScaleMax * RISCV::RVVBitsPerBlock;
221 }
222
223 if (RVVBitsMin != -1U) {
224 // FIXME: Change to >= 32 when VLEN = 32 is supported.
225 assert((RVVBitsMin == 0 || (RVVBitsMin >= 64 && RVVBitsMin <= 65536 &&
226 isPowerOf2_32(RVVBitsMin))) &&
227 "V or Zve* extension requires vector length to be in the range of "
228 "64 to 65536 and a power 2!");
229 assert((RVVBitsMax >= RVVBitsMin || RVVBitsMax == 0) &&
230 "Minimum V extension vector length should not be larger than its "
231 "maximum!");
232 }
233 assert((RVVBitsMax == 0 || (RVVBitsMax >= 64 && RVVBitsMax <= 65536 &&
234 isPowerOf2_32(RVVBitsMax))) &&
235 "V or Zve* extension requires vector length to be in the range of "
236 "64 to 65536 and a power 2!");
237
238 if (RVVBitsMin != -1U) {
239 if (RVVBitsMax != 0) {
240 RVVBitsMin = std::min(RVVBitsMin, RVVBitsMax);
241 RVVBitsMax = std::max(RVVBitsMin, RVVBitsMax);
242 }
243
244 RVVBitsMin = llvm::bit_floor(
245 (RVVBitsMin < 64 || RVVBitsMin > 65536) ? 0 : RVVBitsMin);
246 }
247 RVVBitsMax =
248 llvm::bit_floor((RVVBitsMax < 64 || RVVBitsMax > 65536) ? 0 : RVVBitsMax);
249
251 raw_svector_ostream(Key) << "RVVMin" << RVVBitsMin << "RVVMax" << RVVBitsMax
252 << CPU << TuneCPU << FS;
253 auto &I = SubtargetMap[Key];
254 if (!I) {
255 auto ABIName = Options.MCOptions.getABIName();
256 if (const MDString *ModuleTargetABI = dyn_cast_or_null<MDString>(
257 F.getParent()->getModuleFlag("target-abi"))) {
258 auto TargetABI = RISCVABI::getTargetABI(ABIName);
259 if (TargetABI != RISCVABI::ABI_Unknown &&
260 ModuleTargetABI->getString() != ABIName) {
261 report_fatal_error("-target-abi option != target-abi module flag");
262 }
263 ABIName = ModuleTargetABI->getString();
264 }
265 I = std::make_unique<RISCVSubtarget>(
266 TargetTriple, CPU, TuneCPU, FS, ABIName, RVVBitsMin, RVVBitsMax, *this);
267 }
268 return I.get();
269}
270
277
280 return TargetTransformInfo(std::make_unique<RISCVTTIImpl>(this, F));
281}
282
283// A RISC-V hart has a single byte-addressable address space of 2^XLEN bytes
284// for all memory accesses, so it is reasonable to assume that an
285// implementation has no-op address space casts. If an implementation makes a
286// change to this, they can override it here.
288 unsigned DstAS) const {
289 return true;
290}
291
294 const RISCVSubtarget &ST = C->MF->getSubtarget<RISCVSubtarget>();
296
297 // Add MacroFusion mutation first with a higher priority than later clustering
298 const auto &MacroFusions = ST.getMacroFusions();
299 if (!MacroFusions.empty())
300 DAG->addMutation(createMacroFusionDAGMutation(MacroFusions));
301
302 if (ST.enableMISchedLoadClustering())
303 DAG->addMutation(createLoadClusterDAGMutation(
304 DAG->TII, DAG->TRI, /*ReorderWhileClustering=*/true));
305
306 if (ST.enableMISchedStoreClustering())
307 DAG->addMutation(createStoreClusterDAGMutation(
308 DAG->TII, DAG->TRI, /*ReorderWhileClustering=*/true));
309
310 if (!DisableVectorMaskMutation && ST.hasVInstructions())
311 DAG->addMutation(createRISCVVectorMaskDAGMutation(DAG->TRI));
312
313 return DAG;
314}
315
318 const RISCVSubtarget &ST = C->MF->getSubtarget<RISCVSubtarget>();
320
321 // Add MacroFusion mutation first with a higher priority than later clustering
322 const auto &MacroFusions = ST.getMacroFusions();
323 if (!MacroFusions.empty())
324 DAG->addMutation(createMacroFusionDAGMutation(MacroFusions));
325
326 if (ST.enablePostMISchedLoadClustering())
327 DAG->addMutation(createLoadClusterDAGMutation(
328 DAG->TII, DAG->TRI, /*ReorderWhileClustering=*/true));
329
330 if (ST.enablePostMISchedStoreClustering())
331 DAG->addMutation(createStoreClusterDAGMutation(
332 DAG->TII, DAG->TRI, /*ReorderWhileClustering=*/true));
333
334 return DAG;
335}
336
337namespace {
338
339class RVVRegisterRegAlloc : public RegisterRegAllocBase<RVVRegisterRegAlloc> {
340public:
341 RVVRegisterRegAlloc(const char *N, const char *D, FunctionPassCtor C)
342 : RegisterRegAllocBase(N, D, C) {}
343};
344
345static bool onlyAllocateRVVReg(const TargetRegisterInfo &TRI,
346 const MachineRegisterInfo &MRI,
347 const Register Reg) {
348 const TargetRegisterClass *RC = MRI.getRegClass(Reg);
350}
351
352static FunctionPass *useDefaultRegisterAllocator() { return nullptr; }
353
354static llvm::once_flag InitializeDefaultRVVRegisterAllocatorFlag;
355
356/// -riscv-rvv-regalloc=<fast|basic|greedy> command line option.
357/// This option could designate the rvv register allocator only.
358/// For example: -riscv-rvv-regalloc=basic
359static cl::opt<RVVRegisterRegAlloc::FunctionPassCtor, false,
361 RVVRegAlloc("riscv-rvv-regalloc", cl::Hidden,
363 cl::desc("Register allocator to use for RVV register."));
364
365static void initializeDefaultRVVRegisterAllocatorOnce() {
366 RegisterRegAlloc::FunctionPassCtor Ctor = RVVRegisterRegAlloc::getDefault();
367
368 if (!Ctor) {
369 Ctor = RVVRegAlloc;
370 RVVRegisterRegAlloc::setDefault(RVVRegAlloc);
371 }
372}
373
374static FunctionPass *createBasicRVVRegisterAllocator() {
375 return createBasicRegisterAllocator(onlyAllocateRVVReg);
376}
377
378static FunctionPass *createGreedyRVVRegisterAllocator() {
379 return createGreedyRegisterAllocator(onlyAllocateRVVReg);
380}
381
382static FunctionPass *createFastRVVRegisterAllocator() {
383 return createFastRegisterAllocator(onlyAllocateRVVReg, false);
384}
385
386static RVVRegisterRegAlloc basicRegAllocRVVReg("basic",
387 "basic register allocator",
388 createBasicRVVRegisterAllocator);
389static RVVRegisterRegAlloc
390 greedyRegAllocRVVReg("greedy", "greedy register allocator",
391 createGreedyRVVRegisterAllocator);
392
393static RVVRegisterRegAlloc fastRegAllocRVVReg("fast", "fast register allocator",
394 createFastRVVRegisterAllocator);
395
396class RISCVPassConfig : public TargetPassConfig {
397public:
398 RISCVPassConfig(RISCVTargetMachine &TM, PassManagerBase &PM)
399 : TargetPassConfig(TM, PM) {
400 if (TM.getOptLevel() != CodeGenOptLevel::None)
401 substitutePass(&PostRASchedulerID, &PostMachineSchedulerID);
402 setEnableSinkAndFold(EnableSinkFold);
403 EnableLoopTermFold = true;
404 }
405
406 RISCVTargetMachine &getRISCVTargetMachine() const {
408 }
409
410 void addIRPasses() override;
411 bool addPreISel() override;
412 void addCodeGenPrepare() override;
413 bool addInstSelector() override;
414 bool addIRTranslator() override;
415 void addPreLegalizeMachineIR() override;
416 bool addLegalizeMachineIR() override;
417 void addPreRegBankSelect() override;
418 bool addRegBankSelect() override;
419 bool addGlobalInstructionSelect() override;
420 void addPreEmitPass() override;
421 void addPreEmitPass2() override;
422 void addPreSched2() override;
423 void addMachineSSAOptimization() override;
424 FunctionPass *createRVVRegAllocPass(bool Optimized);
425 bool addRegAssignAndRewriteFast() override;
426 bool addRegAssignAndRewriteOptimized() override;
427 void addPreRegAlloc() override;
428 void addPostRegAlloc() override;
429 void addFastRegAlloc() override;
430 bool addILPOpts() override;
431
432 std::unique_ptr<CSEConfigBase> getCSEConfig() const override;
433};
434} // namespace
435
437 return new RISCVPassConfig(*this, PM);
438}
439
440std::unique_ptr<CSEConfigBase> RISCVPassConfig::getCSEConfig() const {
441 return getStandardCSEConfigForOpt(TM->getOptLevel());
442}
443
444FunctionPass *RISCVPassConfig::createRVVRegAllocPass(bool Optimized) {
445 // Initialize the global default.
446 llvm::call_once(InitializeDefaultRVVRegisterAllocatorFlag,
447 initializeDefaultRVVRegisterAllocatorOnce);
448
449 RegisterRegAlloc::FunctionPassCtor Ctor = RVVRegisterRegAlloc::getDefault();
450 if (Ctor != useDefaultRegisterAllocator)
451 return Ctor();
452
453 if (Optimized)
454 return createGreedyRVVRegisterAllocator();
455
456 return createFastRVVRegisterAllocator();
457}
458
459bool RISCVPassConfig::addRegAssignAndRewriteFast() {
460 addPass(createRVVRegAllocPass(false));
462 if (TM->getOptLevel() != CodeGenOptLevel::None &&
466}
467
468bool RISCVPassConfig::addRegAssignAndRewriteOptimized() {
469 addPass(createRVVRegAllocPass(true));
470 addPass(createVirtRegRewriter(false));
472 if (TM->getOptLevel() != CodeGenOptLevel::None &&
476}
477
478void RISCVPassConfig::addIRPasses() {
481
482 if (getOptLevel() != CodeGenOptLevel::None) {
485
489 }
490
492
493 if (getOptLevel() == CodeGenOptLevel::Aggressive && EnableSelectOpt)
494 addPass(createSelectOptimizePass());
495}
496
497bool RISCVPassConfig::addPreISel() {
498 if (TM->getOptLevel() != CodeGenOptLevel::None)
500 if (TM->getOptLevel() != CodeGenOptLevel::None) {
501 // Add a barrier before instruction selection so that we will not get
502 // deleted block address after enabling default outlining. See D99707 for
503 // more details.
504 addPass(createBarrierNoopPass());
505 }
506
507 if ((TM->getOptLevel() != CodeGenOptLevel::None &&
510 // FIXME: Like AArch64, we disable extern global merging by default due to
511 // concerns it might regress some workloads. Unlike AArch64, we don't
512 // currently support enabling the pass in an "OnlyOptimizeForSize" mode.
513 // Investigating and addressing both items are TODO.
514 addPass(createGlobalMergePass(TM, /* MaxOffset */ 2047,
515 /* OnlyOptimizeForSize */ false,
516 /* MergeExternalByDefault */ true));
517 }
518
519 return false;
520}
521
522void RISCVPassConfig::addCodeGenPrepare() {
523 if (getOptLevel() != CodeGenOptLevel::None)
526}
527
528bool RISCVPassConfig::addInstSelector() {
529 addPass(createRISCVISelDag(getRISCVTargetMachine(), getOptLevel()));
530
531 return false;
532}
533
534bool RISCVPassConfig::addIRTranslator() {
535 addPass(new IRTranslator(getOptLevel()));
536 return false;
537}
538
539void RISCVPassConfig::addPreLegalizeMachineIR() {
540 if (getOptLevel() == CodeGenOptLevel::None) {
542 } else {
544 }
545}
546
547bool RISCVPassConfig::addLegalizeMachineIR() {
548 addPass(new Legalizer());
549 return false;
550}
551
552void RISCVPassConfig::addPreRegBankSelect() {
553 if (getOptLevel() != CodeGenOptLevel::None)
555}
556
557bool RISCVPassConfig::addRegBankSelect() {
558 addPass(new RegBankSelect());
559 return false;
560}
561
562bool RISCVPassConfig::addGlobalInstructionSelect() {
563 addPass(new InstructionSelect(getOptLevel()));
564 return false;
565}
566
567void RISCVPassConfig::addPreSched2() {
569
570 // Emit KCFI checks for indirect calls.
571 addPass(createKCFIPass());
572 if (TM->getOptLevel() != CodeGenOptLevel::None)
574}
575
576void RISCVPassConfig::addPreEmitPass() {
577 // TODO: It would potentially be better to schedule copy propagation after
578 // expanding pseudos (in addPreEmitPass2). However, performing copy
579 // propagation after the machine outliner (which runs after addPreEmitPass)
580 // currently leads to incorrect code-gen, where copies to registers within
581 // outlined functions are removed erroneously.
582 if (TM->getOptLevel() >= CodeGenOptLevel::Default &&
585 if (TM->getOptLevel() >= CodeGenOptLevel::Default)
587 // The IndirectBranchTrackingPass inserts lpad and could have changed the
588 // basic block alignment. It must be done before Branch Relaxation to
589 // prevent the adjusted offset exceeding the branch range.
591 addPass(&BranchRelaxationPassID);
593}
594
595void RISCVPassConfig::addPreEmitPass2() {
596 if (TM->getOptLevel() != CodeGenOptLevel::None) {
597 addPass(createRISCVMoveMergePass());
598 // Schedule PushPop Optimization before expansion of Pseudo instruction,
599 // ensuring return instruction is detected correctly.
601 }
603
604 // Add QC Relaxation Markers as late as possible, and only for RV32
605 if (TM->getOptLevel() != CodeGenOptLevel::None &&
606 TM->getTargetTriple().isRISCV32())
608
609 // Schedule the expansion of AMOs at the last possible moment, avoiding the
610 // possibility for other passes to break the requirements for forward
611 // progress in the LR/SC block.
613
614 // KCFI indirect call checks are lowered to a bundle.
616 return MF.getFunction().getParent()->getModuleFlag("kcfi");
617 }));
618
620 addPass(createCFIInstrInserter());
621}
622
623void RISCVPassConfig::addMachineSSAOptimization() {
624 // It's beneficial to reduce the VL to enable more
625 // Machine SSA optimizations.
626 if (TM->getOptLevel() != CodeGenOptLevel::None)
628
631
633
634 if (TM->getTargetTriple().isRISCV64()) {
635 addPass(createRISCVOptWInstrsPass());
636 }
637}
638
639void RISCVPassConfig::addPreRegAlloc() {
641 if (TM->getOptLevel() != CodeGenOptLevel::None) {
643 // Add Zilsd pre-allocation load/store optimization
645 }
646
650
651 if (TM->getOptLevel() != CodeGenOptLevel::None && EnableMachinePipeliner)
652 addPass(&MachinePipelinerID);
653
655}
656
657void RISCVPassConfig::addFastRegAlloc() {
658 addPass(&InitUndefID);
660}
661
662
663void RISCVPassConfig::addPostRegAlloc() {
664 if (TM->getOptLevel() != CodeGenOptLevel::None &&
667}
668
669bool RISCVPassConfig::addILPOpts() {
671 addPass(&MachineCombinerID);
672
673 return true;
674}
675
677#define GET_PASS_REGISTRY "RISCVPassRegistry.def"
679
680 PB.registerLateLoopOptimizationsEPCallback([=](LoopPassManager &LPM,
681 OptimizationLevel Level) {
682 if (Level != OptimizationLevel::O0)
684 });
685}
686
691
697
700 SMDiagnostic &Error, SMRange &SourceRange) const {
701 const auto &YamlMFI =
702 static_cast<const yaml::RISCVMachineFunctionInfo &>(MFI);
703 PFS.MF.getInfo<RISCVMachineFunctionInfo>()->initializeBaseYamlFields(YamlMFI);
704 return false;
705}
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 > EnableSelectOpt("aarch64-select-opt", cl::Hidden, cl::desc("Enable select to branch optimizations"), cl::init(true))
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()
#define X(NUM, ENUM, NAME)
Definition ELF.h:854
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
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)
static cl::opt< bool > EnableSelectOpt("riscv-select-opt", cl::Hidden, cl::desc("Enable select to branch optimizations"), cl::init(true))
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:105
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:261
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:722
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 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:303
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)
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: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.
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 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 * createRISCVExpandAtomicPseudoPass()
FunctionPass * createRISCVPostRAExpandPseudoPass()
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...
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:85
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()
LLVM_ABI void initializeMachineKCFILegacyPass(PassRegistry &)
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...
LLVM_ABI FunctionPass * createUnpackMachineBundlesLegacy(std::function< bool(const MachineFunction &)> Ftor)
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:69
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:163
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.
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 initializeRISCVQCRelaxMarkingPass(PassRegistry &)
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 &)
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:397
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)
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 &)
FunctionPass * createRISCVQCRelaxMarkingPass()
#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.