LLVM 17.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"
17#include "RISCVMacroFusion.h"
21#include "llvm/ADT/STLExtras.h"
29#include "llvm/CodeGen/Passes.h"
36#include "llvm/Transforms/IPO.h"
37#include <optional>
38using namespace llvm;
39
41 "riscv-enable-copyelim",
42 cl::desc("Enable the redundant copy elimination pass"), cl::init(true),
44
45// FIXME: Unify control over GlobalMerge.
47 EnableGlobalMerge("riscv-enable-global-merge", cl::Hidden,
48 cl::desc("Enable the global merge pass"));
49
50static cl::opt<bool>
51 EnableMachineCombiner("riscv-enable-machine-combiner",
52 cl::desc("Enable the machine combiner pass"),
53 cl::init(true), cl::Hidden);
54
56 "riscv-v-vector-bits-max",
57 cl::desc("Assume V extension vector registers are at most this big, "
58 "with zero meaning no maximum size is assumed."),
60
62 "riscv-v-vector-bits-min",
63 cl::desc("Assume V extension vector registers are at least this big, "
64 "with zero meaning no minimum size is assumed. A value of -1 "
65 "means use Zvl*b extension. This is primarily used to enable "
66 "autovectorization with fixed width vectors."),
67 cl::init(-1), cl::Hidden);
68
70 "riscv-enable-copy-propagation",
71 cl::desc("Enable the copy propagation with RISC-V copy instr"),
72 cl::init(true), cl::Hidden);
73
89}
90
92 if (TT.isArch64Bit())
93 return "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128";
94 assert(TT.isArch32Bit() && "only RV32 and RV64 are currently supported");
95 return "e-m:e-p:32:32-i64:64-n32-S128";
96}
97
99 std::optional<Reloc::Model> RM) {
100 return RM.value_or(Reloc::Static);
101}
102
104 StringRef CPU, StringRef FS,
105 const TargetOptions &Options,
106 std::optional<Reloc::Model> RM,
107 std::optional<CodeModel::Model> CM,
108 CodeGenOpt::Level OL, bool JIT)
109 : LLVMTargetMachine(T, computeDataLayout(TT), TT, CPU, FS, Options,
111 getEffectiveCodeModel(CM, CodeModel::Small), OL),
112 TLOF(std::make_unique<RISCVELFTargetObjectFile>()) {
113 initAsmInfo();
114
115 // RISC-V supports the MachineOutliner.
116 setMachineOutliner(true);
118
119 if (TT.isOSFuchsia() && !TT.isArch64Bit())
120 report_fatal_error("Fuchsia is only supported for 64-bit");
121}
122
123const RISCVSubtarget *
125 Attribute CPUAttr = F.getFnAttribute("target-cpu");
126 Attribute TuneAttr = F.getFnAttribute("tune-cpu");
127 Attribute FSAttr = F.getFnAttribute("target-features");
128
129 std::string CPU =
130 CPUAttr.isValid() ? CPUAttr.getValueAsString().str() : TargetCPU;
131 std::string TuneCPU =
132 TuneAttr.isValid() ? TuneAttr.getValueAsString().str() : CPU;
133 std::string FS =
134 FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS;
135
136 unsigned RVVBitsMin = RVVVectorBitsMinOpt;
137 unsigned RVVBitsMax = RVVVectorBitsMaxOpt;
138
139 Attribute VScaleRangeAttr = F.getFnAttribute(Attribute::VScaleRange);
140 if (VScaleRangeAttr.isValid()) {
141 if (!RVVVectorBitsMinOpt.getNumOccurrences())
142 RVVBitsMin = VScaleRangeAttr.getVScaleRangeMin() * RISCV::RVVBitsPerBlock;
143 std::optional<unsigned> VScaleMax = VScaleRangeAttr.getVScaleRangeMax();
144 if (VScaleMax.has_value() && !RVVVectorBitsMaxOpt.getNumOccurrences())
145 RVVBitsMax = *VScaleMax * RISCV::RVVBitsPerBlock;
146 }
147
148 if (RVVBitsMin != -1U) {
149 // FIXME: Change to >= 32 when VLEN = 32 is supported.
150 assert((RVVBitsMin == 0 || (RVVBitsMin >= 64 && RVVBitsMin <= 65536 &&
151 isPowerOf2_32(RVVBitsMin))) &&
152 "V or Zve* extension requires vector length to be in the range of "
153 "64 to 65536 and a power 2!");
154 assert((RVVBitsMax >= RVVBitsMin || RVVBitsMax == 0) &&
155 "Minimum V extension vector length should not be larger than its "
156 "maximum!");
157 }
158 assert((RVVBitsMax == 0 || (RVVBitsMax >= 64 && RVVBitsMax <= 65536 &&
159 isPowerOf2_32(RVVBitsMax))) &&
160 "V or Zve* extension requires vector length to be in the range of "
161 "64 to 65536 and a power 2!");
162
163 if (RVVBitsMin != -1U) {
164 if (RVVBitsMax != 0) {
165 RVVBitsMin = std::min(RVVBitsMin, RVVBitsMax);
166 RVVBitsMax = std::max(RVVBitsMin, RVVBitsMax);
167 }
168
169 RVVBitsMin = llvm::bit_floor(
170 (RVVBitsMin < 64 || RVVBitsMin > 65536) ? 0 : RVVBitsMin);
171 }
172 RVVBitsMax =
173 llvm::bit_floor((RVVBitsMax < 64 || RVVBitsMax > 65536) ? 0 : RVVBitsMax);
174
176 Key += "RVVMin";
177 Key += std::to_string(RVVBitsMin);
178 Key += "RVVMax";
179 Key += std::to_string(RVVBitsMax);
180 Key += CPU;
181 Key += TuneCPU;
182 Key += FS;
183 auto &I = SubtargetMap[Key];
184 if (!I) {
185 // This needs to be done before we create a new subtarget since any
186 // creation will depend on the TM and the code generation flags on the
187 // function that reside in TargetOptions.
189 auto ABIName = Options.MCOptions.getABIName();
190 if (const MDString *ModuleTargetABI = dyn_cast_or_null<MDString>(
191 F.getParent()->getModuleFlag("target-abi"))) {
192 auto TargetABI = RISCVABI::getTargetABI(ABIName);
193 if (TargetABI != RISCVABI::ABI_Unknown &&
194 ModuleTargetABI->getString() != ABIName) {
195 report_fatal_error("-target-abi option != target-abi module flag");
196 }
197 ABIName = ModuleTargetABI->getString();
198 }
199 I = std::make_unique<RISCVSubtarget>(
200 TargetTriple, CPU, TuneCPU, FS, ABIName, RVVBitsMin, RVVBitsMax, *this);
201 }
202 return I.get();
203}
204
206 BumpPtrAllocator &Allocator, const Function &F,
207 const TargetSubtargetInfo *STI) const {
208 return RISCVMachineFunctionInfo::create<RISCVMachineFunctionInfo>(Allocator,
209 F, STI);
210}
211
214 return TargetTransformInfo(RISCVTTIImpl(this, F));
215}
216
217// A RISC-V hart has a single byte-addressable address space of 2^XLEN bytes
218// for all memory accesses, so it is reasonable to assume that an
219// implementation has no-op address space casts. If an implementation makes a
220// change to this, they can override it here.
222 unsigned DstAS) const {
223 return true;
224}
225
226namespace {
227class RISCVPassConfig : public TargetPassConfig {
228public:
229 RISCVPassConfig(RISCVTargetMachine &TM, PassManagerBase &PM)
230 : TargetPassConfig(TM, PM) {}
231
232 RISCVTargetMachine &getRISCVTargetMachine() const {
233 return getTM<RISCVTargetMachine>();
234 }
235
237 createMachineScheduler(MachineSchedContext *C) const override {
238 const RISCVSubtarget &ST = C->MF->getSubtarget<RISCVSubtarget>();
239 if (ST.hasMacroFusion()) {
242 return DAG;
243 }
244 return nullptr;
245 }
246
248 createPostMachineScheduler(MachineSchedContext *C) const override {
249 const RISCVSubtarget &ST = C->MF->getSubtarget<RISCVSubtarget>();
250 if (ST.hasMacroFusion()) {
253 return DAG;
254 }
255 return nullptr;
256 }
257
258 void addIRPasses() override;
259 bool addPreISel() override;
260 bool addInstSelector() override;
261 bool addIRTranslator() override;
262 bool addLegalizeMachineIR() override;
263 bool addRegBankSelect() override;
264 bool addGlobalInstructionSelect() override;
265 void addPreEmitPass() override;
266 void addPreEmitPass2() override;
267 void addPreSched2() override;
268 void addMachineSSAOptimization() override;
269 void addPreRegAlloc() override;
270 void addPostRegAlloc() override;
271 void addOptimizedRegAlloc() override;
272};
273} // namespace
274
276 return new RISCVPassConfig(*this, PM);
277}
278
279void RISCVPassConfig::addIRPasses() {
280 addPass(createAtomicExpandPass());
281
282 if (getOptLevel() != CodeGenOpt::None) {
286 }
287
289}
290
291bool RISCVPassConfig::addPreISel() {
292 if (TM->getOptLevel() != CodeGenOpt::None) {
293 // Add a barrier before instruction selection so that we will not get
294 // deleted block address after enabling default outlining. See D99707 for
295 // more details.
296 addPass(createBarrierNoopPass());
297 }
298
300 addPass(createGlobalMergePass(TM, /* MaxOffset */ 2047,
301 /* OnlyOptimizeForSize */ false,
302 /* MergeExternalByDefault */ true));
303 }
304
305 return false;
306}
307
308bool RISCVPassConfig::addInstSelector() {
309 addPass(createRISCVISelDag(getRISCVTargetMachine(), getOptLevel()));
310
311 return false;
312}
313
314bool RISCVPassConfig::addIRTranslator() {
315 addPass(new IRTranslator(getOptLevel()));
316 return false;
317}
318
319bool RISCVPassConfig::addLegalizeMachineIR() {
320 addPass(new Legalizer());
321 return false;
322}
323
324bool RISCVPassConfig::addRegBankSelect() {
325 addPass(new RegBankSelect());
326 return false;
327}
328
329bool RISCVPassConfig::addGlobalInstructionSelect() {
330 addPass(new InstructionSelect(getOptLevel()));
331 return false;
332}
333
334void RISCVPassConfig::addPreSched2() {}
335
336void RISCVPassConfig::addPreEmitPass() {
337 addPass(&BranchRelaxationPassID);
339
340 // TODO: It would potentially be better to schedule copy propagation after
341 // expanding pseudos (in addPreEmitPass2). However, performing copy
342 // propagation after the machine outliner (which runs after addPreEmitPass)
343 // currently leads to incorrect code-gen, where copies to registers within
344 // outlined functions are removed erroneously.
345 if (TM->getOptLevel() >= CodeGenOpt::Default && EnableRISCVCopyPropagation)
347}
348
349void RISCVPassConfig::addPreEmitPass2() {
351
352 // Schedule the expansion of AMOs at the last possible moment, avoiding the
353 // possibility for other passes to break the requirements for forward
354 // progress in the LR/SC block.
356}
357
358void RISCVPassConfig::addMachineSSAOptimization() {
361 addPass(&MachineCombinerID);
362
363 if (TM->getTargetTriple().getArch() == Triple::riscv64) {
364 addPass(createRISCVOptWInstrsPass());
365 }
366}
367
368void RISCVPassConfig::addPreRegAlloc() {
370 if (TM->getOptLevel() != CodeGenOpt::None)
373}
374
375void RISCVPassConfig::addOptimizedRegAlloc() {
376 if (getOptimizeRegAlloc())
377 insertPass(&DetectDeadLanesID, &RISCVInitUndefID);
378
380}
381
382void RISCVPassConfig::addPostRegAlloc() {
383 if (TM->getOptLevel() != CodeGenOpt::None && EnableRedundantCopyElimination)
385}
386
390}
391
394 const auto *MFI = MF.getInfo<RISCVMachineFunctionInfo>();
395 return new yaml::RISCVMachineFunctionInfo(*MFI);
396}
397
400 SMDiagnostic &Error, SMRange &SourceRange) const {
401 const auto &YamlMFI =
402 static_cast<const yaml::RISCVMachineFunctionInfo &>(MFI);
403 PFS.MF.getInfo<RISCVMachineFunctionInfo>()->initializeBaseYamlFields(YamlMFI);
404 return false;
405}
static cl::opt< bool > EnableRedundantCopyElimination("aarch64-enable-copyelim", cl::desc("Enable the redundant copy elimination pass"), cl::init(true), cl::Hidden)
#define LLVM_EXTERNAL_VISIBILITY
Definition: Compiler.h:127
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
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.
static LVOptions Options
Definition: LVOptions.cpp:25
static std::string computeDataLayout()
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
const char LLVMTargetMachineRef TM
static cl::opt< bool > EnableRedundantCopyElimination("riscv-enable-copyelim", cl::desc("Enable the redundant copy elimination pass"), cl::init(true), cl::Hidden)
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"))
LLVM_EXTERNAL_VISIBILITY void LLVMInitializeRISCVTarget()
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 Reloc::Model getEffectiveRelocModel(const Triple &TT, std::optional< Reloc::Model > RM)
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 TargetTransformInfo::Concept conforming object specific to the RISC-V target mach...
Basic Register Allocator
This file describes the interface of the MachineFunctionPass responsible for assigning the generic vi...
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file contains some templates that are useful if you are working with the STL at all.
Target-Independent Code Generator Pass Configuration Options pass.
This pass exposes codegen information to IR-level passes.
std::optional< unsigned > getVScaleRangeMax() const
Returns the maximum value for the vscale_range attribute or std::nullopt when unknown.
Definition: Attributes.cpp:380
unsigned getVScaleRangeMin() const
Returns the minimum value for the vscale_range attribute.
Definition: Attributes.cpp:374
StringRef getValueAsString() const
Return the attribute's value as a string.
Definition: Attributes.cpp:317
bool isValid() const
Return true if the attribute is any kind of attribute.
Definition: Attributes.h:187
Allocate memory in an ever growing pool, as if by bump-pointer.
Definition: Allocator.h:66
Lightweight error class with error context and mandatory checking.
Definition: Error.h:156
This pass is responsible for selecting generic machine instructions to target-specific instructions.
This class describes a target machine that is implemented with the LLVM target-independent code gener...
StringRef getABIName() const
getABIName - If this returns a non-empty string this represents the textual name of the ABI that we w...
A single uniqued string.
Definition: Metadata.h:611
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
This implementation is used for RISC-V ELF targets.
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...
TargetPassConfig * createPassConfig(PassManagerBase &PM) override
Create a pass configuration object to be used by addPassToEmitX methods for generating a pipeline of ...
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.
RISCVTargetMachine(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, std::optional< Reloc::Model > RM, std::optional< CodeModel::Model > CM, CodeGenOpt::Level OL, bool JIT)
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.
Definition: RegBankSelect.h:91
Instances of this class encapsulate one diagnostic report, allowing printing to a raw_ostream as a ca...
Definition: SourceMgr.h:281
Represents a range in source code.
Definition: SMLoc.h:48
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...
void addMutation(std::unique_ptr< ScheduleDAGMutation > Mutation)
Add a postprocessing step to the DAG builder.
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:50
std::string str() const
str - Get the contents as an std::string.
Definition: StringRef.h:222
Triple TargetTriple
Triple string, CPU name, and target feature strings the TargetMachine instance is created with.
Definition: TargetMachine.h:97
void setMachineOutliner(bool Enable)
void setSupportsDefaultOutlining(bool Enable)
std::string TargetFS
Definition: TargetMachine.h:99
std::string TargetCPU
Definition: TargetMachine.h:98
std::unique_ptr< const MCSubtargetInfo > STI
TargetOptions Options
void resetTargetOptions(const Function &F) const
Reset the target options based on the function's attributes.
MCTargetOptions MCOptions
Machine level options.
Target-Independent Code Generator Pass Configuration Options.
virtual void addOptimizedRegAlloc()
addOptimizedRegAlloc - Add passes related to register allocation.
virtual void addIRPasses()
Add common target configurable passes that perform LLVM IR to IR transforms following machine indepen...
virtual void addMachineSSAOptimization()
addMachineSSAOptimization - Add standard passes that optimize machine instructions in SSA form.
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:44
PassManagerBase - An abstract interface to allow code to add passes to a pass manager without having ...
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
Level
Code generation optimization level.
Definition: CodeGen.h:57
@ Default
-O2, -Os
Definition: CodeGen.h:60
ABI getTargetABI(StringRef ABIName)
static constexpr unsigned RVVBitsPerBlock
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:445
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
void initializeRISCVExpandPseudoPass(PassRegistry &)
FunctionPass * createRISCVExpandAtomicPseudoPass()
FunctionPass * createAtomicExpandPass()
AtomicExpandPass - At IR level this pass replace atomic instructions with __atomic_* library calls,...
Target & getTheRISCV32Target()
void initializeRISCVInsertVSETVLIPass(PassRegistry &)
void initializeRISCVInitUndefPass(PassRegistry &)
std::unique_ptr< ScheduleDAGMutation > createRISCVMacroFusionDAGMutation()
Note that you have to add: DAG.addMutation(createRISCVMacroFusionDAGMutation()); to RISCVPassConfig::...
ScheduleDAGMILive * createGenericSchedLive(MachineSchedContext *C)
Create the standard converging machine scheduler.
FunctionPass * createRISCVGatherScatterLoweringPass()
FunctionPass * createRISCVMergeBaseOffsetOptPass()
Returns an instance of the Merge Base Offset Optimization pass.
void initializeRISCVDAGToDAGISelPass(PassRegistry &)
char & MachineCombinerID
This pass performs instruction combining using trace metrics to estimate critical-path and resource d...
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:292
char & BranchRelaxationPassID
BranchRelaxation - This pass replaces branches that need to jump further than is supported by a branc...
FunctionPass * createRISCVMakeCompressibleOptPass()
Returns an instance of the Make Compressible Optimization pass.
FunctionPass * createRISCVRedundantCopyEliminationPass()
Pass * createGlobalMergePass(const TargetMachine *TM, unsigned MaximalOffset, bool OnlyOptimizeForSize=false, bool MergeExternalByDefault=false)
GlobalMerge - This pass merges internal (by default) globals into structs to enable reuse of a base p...
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:145
char & DetectDeadLanesID
This pass adds dead/undef flags after analyzing subregister lanes.
FunctionPass * createRISCVInsertVSETVLIPass()
Returns an instance of the Insert VSETVLI pass.
FunctionPass * createRISCVISelDag(RISCVTargetMachine &TM, CodeGenOpt::Level OptLevel)
FunctionPass * createRISCVOptWInstrsPass()
FunctionPass * createInterleavedAccessPass()
InterleavedAccess Pass - This pass identifies and matches interleaved memory accesses to target speci...
void initializeGlobalISel(PassRegistry &)
Initialize all passes linked into the GlobalISel library.
Definition: GlobalISel.cpp:17
ScheduleDAGMI * createGenericSchedPostRA(MachineSchedContext *C)
Create a generic scheduler with no vreg liveness or DAG mutation passes.
void initializeRISCVMakeCompressibleOptPass(PassRegistry &)
FunctionPass * createRISCVCodeGenPreparePass()
ModulePass * createBarrierNoopPass()
createBarrierNoopPass - This pass is purely a module pass barrier in a pass manager.
void initializeRISCVOptWInstrsPass(PassRegistry &)
void initializeRISCVCodeGenPreparePass(PassRegistry &)
Target & getTheRISCV64Target()
void initializeRISCVMergeBaseOffsetOptPass(PassRegistry &)
void initializeRISCVGatherScatterLoweringPass(PassRegistry &)
FunctionPass * createRISCVExpandPseudoPass()
FunctionPass * createRISCVPreRAExpandPseudoPass()
T bit_floor(T Value)
Returns the largest integral power of two no greater than Value if Value is nonzero.
Definition: bit.h:291
MachineFunctionPass * createMachineCopyPropagationPass(bool UseCopyInstr)
void initializeRISCVPreRAExpandPseudoPass(PassRegistry &)
char & RISCVInitUndefID
Definition: BitVector.h:858
MachineFunctionInfo - This class can be derived from and used by targets to hold private target-speci...
MachineSchedContext provides enough context from the MachineScheduler pass for the target to instanti...
RegisterTargetMachine - Helper template for registering a target machine implementation,...
Targets should override this in a way that mirrors the implementation of llvm::MachineFunctionInfo.