LLVM 24.0.0git
ARMTargetMachine.cpp
Go to the documentation of this file.
1//===-- ARMTargetMachine.cpp - Define TargetMachine for ARM ---------------===//
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//
10//===----------------------------------------------------------------------===//
11
12#include "ARMTargetMachine.h"
13#include "ARM.h"
14#include "ARMLatencyMutations.h"
16#include "ARMMacroFusion.h"
17#include "ARMSubtarget.h"
18#include "ARMTargetObjectFile.h"
22#include "llvm/ADT/StringRef.h"
35#include "llvm/CodeGen/Passes.h"
37#include "llvm/IR/Attributes.h"
38#include "llvm/IR/DataLayout.h"
39#include "llvm/IR/Function.h"
40#include "llvm/IR/Module.h"
42#include "llvm/Pass.h"
54#include "llvm/Transforms/IPO.h"
56#include <cassert>
57#include <memory>
58#include <optional>
59#include <string>
60
61using namespace llvm;
62
63static cl::opt<bool>
64DisableA15SDOptimization("disable-a15-sd-optimization", cl::Hidden,
65 cl::desc("Inhibit optimization of S->D register accesses on A15"),
66 cl::init(false));
67
68static cl::opt<bool>
69EnableAtomicTidy("arm-atomic-cfg-tidy", cl::Hidden,
70 cl::desc("Run SimplifyCFG after expanding atomic operations"
71 " to make use of cmpxchg flow-based information"),
72 cl::init(true));
73
74static cl::opt<bool>
75EnableARMLoadStoreOpt("arm-load-store-opt", cl::Hidden,
76 cl::desc("Enable ARM load/store optimization pass"),
77 cl::init(true));
78
79// FIXME: Unify control over GlobalMerge.
81EnableGlobalMerge("arm-global-merge", cl::Hidden,
82 cl::desc("Enable the global merge pass"));
83
84namespace llvm {
86}
87
118
119static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) {
120 if (TT.isOSBinFormatMachO())
121 return std::make_unique<TargetLoweringObjectFileMachO>();
122 if (TT.isOSWindows())
123 return std::make_unique<TargetLoweringObjectFileCOFF>();
124 return std::make_unique<ARMElfTargetObjectFile>();
125}
126
128 std::optional<Reloc::Model> RM) {
129 if (!RM)
130 // Default relocation model on Darwin is PIC.
131 return TT.isOSBinFormatMachO() ? Reloc::PIC_ : Reloc::Static;
132
133 if (*RM == Reloc::ROPI || *RM == Reloc::RWPI || *RM == Reloc::ROPI_RWPI)
134 assert(TT.isOSBinFormatELF() &&
135 "ROPI/RWPI currently only supported for ELF");
136
137 // DynamicNoPIC is only used on darwin.
138 if (*RM == Reloc::DynamicNoPIC && !TT.isOSDarwin())
139 return Reloc::Static;
140
141 return *RM;
142}
143
144/// Create an ARM architecture model.
145///
147 StringRef CPU, StringRef FS,
148 const TargetOptions &Options,
149 std::optional<Reloc::Model> RM,
150 std::optional<CodeModel::Model> CM,
153 T, TT.computeDataLayout(Options.MCOptions.ABIName), TT, CPU, FS,
155 getEffectiveCodeModel(CM, CodeModel::Small), OL),
156 TargetABI(ARM::computeTargetABI(TT, Options.MCOptions.ABIName)),
158
159 // Default to triple-appropriate float ABI. -target-abi=aapcs16 forces hard
160 // float regardless of the triple default.
161 if (Options.FloatABIType == FloatABI::Default) {
162 if (TargetABI == ARM::ARM_ABI_AAPCS16 ||
163 TT.getDefaultFloatABI() == FloatABI::Hard)
164 this->Options.FloatABIType = FloatABI::Hard;
165 else
166 this->Options.FloatABIType = FloatABI::Soft;
167 }
168
169 // Default to triple-appropriate EABI
170 if (Options.EABIVersion == EABI::Default ||
171 Options.EABIVersion == EABI::Unknown) {
172 // musl is compatible with glibc with regard to EABI version
173 if ((TargetTriple.getEnvironment() == Triple::GNUEABI ||
174 TargetTriple.getEnvironment() == Triple::GNUEABIT64 ||
175 TargetTriple.getEnvironment() == Triple::GNUEABIHF ||
176 TargetTriple.getEnvironment() == Triple::GNUEABIHFT64 ||
177 TargetTriple.getEnvironment() == Triple::MuslEABI ||
178 TargetTriple.getEnvironment() == Triple::MuslEABIHF ||
179 TargetTriple.getEnvironment() == Triple::OpenHOS) &&
180 !(TargetTriple.isOSWindows() || TargetTriple.isOSDarwin()))
181 this->Options.EABIVersion = EABI::GNU;
182 else
183 this->Options.EABIVersion = EABI::EABI5;
184 }
185
186 if (TT.isOSBinFormatMachO()) {
187 this->Options.TrapUnreachable = true;
188 this->Options.NoTrapAfterNoreturn = true;
189 }
190
191 // ARM supports the debug entry values.
193
194 initAsmInfo();
195
196 // ARM supports the MachineOutliner.
197 setMachineOutliner(true);
199}
200
202
209
210const ARMSubtarget *
212 Attribute CPUAttr = F.getFnAttribute("target-cpu");
213 Attribute FSAttr = F.getFnAttribute("target-features");
214
215 std::string CPU =
216 CPUAttr.isValid() ? CPUAttr.getValueAsString().str() : TargetCPU;
217 std::string FS =
218 FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS;
219
220 // FIXME: This is related to the code below to reset the target options,
221 // we need to know whether or not the soft float flag is set on the
222 // function before we can generate a subtarget. We also need to use
223 // it as a key for the subtarget since that can be the only difference
224 // between two functions.
225 bool SoftFloat = F.getFnAttribute("use-soft-float").getValueAsBool();
226 // If the soft float attribute is set on the function turn on the soft float
227 // subtarget feature.
228 if (SoftFloat)
229 FS += FS.empty() ? "+soft-float" : ",+soft-float";
230
231 // Use the optminsize to identify the subtarget, but don't use it in the
232 // feature string.
233 std::string Key = CPU + FS;
234 if (F.hasMinSize())
235 Key += "+minsize";
236
237 DenormalMode DM = F.getDenormalFPEnv().DefaultMode;
238 if (DM != DenormalMode::getIEEE())
239 Key += "denormal-fp-math=" + DM.str();
240
241 // The float ABI comes from the "float-abi" module flag if present, otherwise
242 // from the legacy -float-abi target option (which the constructor seeded from
243 // the target triple).
244 FloatABI::ABIType FloatABI = F.getParent()->getFloatABI();
246 FloatABI = Options.FloatABIType;
248 "expected TargetMachine constructor to overwrite default float abi");
249 }
250
251 // It is legal to have FloatABI::Hard with +soft-float for targets with SIMD
252 // registers, but no floating-point hardware (mve+nofp)
253 Key += FloatABI == FloatABI::Hard ? "+hard-float-abi" : "+soft-float-abi";
254
255 auto &I = SubtargetMap[Key];
256 if (!I) {
257 I = std::make_unique<ARMSubtarget>(TargetTriple, CPU, FS, *this, isLittle,
258 FloatABI, F.hasMinSize(), DM);
259
260 if (!I->isThumb() && !I->hasARMOps())
261 F.getContext().emitError("Function '" + F.getName() + "' uses ARM "
262 "instructions, but the target does not support ARM mode execution.");
263 }
264
265 return I.get();
266}
267
270 return TargetTransformInfo(std::make_unique<ARMTTIImpl>(this, F));
271}
272
276 // add DAG Mutations here.
277 const ARMSubtarget &ST = C->MF->getSubtarget<ARMSubtarget>();
278 if (ST.hasFusion())
280 return DAG;
281}
282
286 // add DAG Mutations here.
287 const ARMSubtarget &ST = C->MF->getSubtarget<ARMSubtarget>();
288 if (ST.hasFusion())
290 if (auto Mutation = createARMLatencyMutations(ST, C->AA))
291 DAG->addMutation(std::move(Mutation));
292 return DAG;
293}
294
296 StringRef CPU, StringRef FS,
297 const TargetOptions &Options,
298 std::optional<Reloc::Model> RM,
299 std::optional<CodeModel::Model> CM,
300 CodeGenOptLevel OL, bool JIT)
301 : ARMBaseTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL) {}
302
304 StringRef CPU, StringRef FS,
305 const TargetOptions &Options,
306 std::optional<Reloc::Model> RM,
307 std::optional<CodeModel::Model> CM,
308 CodeGenOptLevel OL, bool JIT)
309 : ARMBaseTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL) {}
310
311namespace {
312
313/// ARM Code Generator Pass Configuration Options.
314class ARMPassConfig : public TargetPassConfig {
315public:
316 ARMPassConfig(ARMBaseTargetMachine &TM, PassManagerBase &PM)
317 : TargetPassConfig(TM, PM) {}
318
319 ARMBaseTargetMachine &getARMTargetMachine() const {
321 }
322
323 void addIRPasses() override;
324 void addCodeGenPrepare() override;
325 bool addPreISel() override;
326 bool addInstSelector() override;
327 bool addIRTranslator() override;
328 bool addLegalizeMachineIR() override;
329 bool addRegBankSelect() override;
330 bool addGlobalInstructionSelect() override;
331 void addPreRegAlloc() override;
332 void addPreSched2() override;
333 void addPreEmitPass() override;
334 void addPreEmitPass2() override;
335
336 std::unique_ptr<CSEConfigBase> getCSEConfig() const override;
337};
338
339class ARMExecutionDomainFix : public ExecutionDomainFix {
340public:
341 static char ID;
342 ARMExecutionDomainFix() : ExecutionDomainFix(ID, ARM::DPRRegClass) {}
343 StringRef getPassName() const override {
344 return "ARM Execution Domain Fix";
345 }
346};
347char ARMExecutionDomainFix::ID;
348
349} // end anonymous namespace
350
351INITIALIZE_PASS_BEGIN(ARMExecutionDomainFix, "arm-execution-domain-fix",
352 "ARM Execution Domain Fix", false, false)
354INITIALIZE_PASS_END(ARMExecutionDomainFix, "arm-execution-domain-fix",
355 "ARM Execution Domain Fix", false, false)
356
358#define GET_PASS_REGISTRY "ARMPassRegistry.def"
360}
361
363 return new ARMPassConfig(*this, PM);
364}
365
366std::unique_ptr<CSEConfigBase> ARMPassConfig::getCSEConfig() const {
367 return getStandardCSEConfigForOpt(TM->getOptLevel());
368}
369
370void ARMPassConfig::addIRPasses() {
371 if (TM->Options.ThreadModel == ThreadModel::Single)
372 addPass(createLowerAtomicPass());
373 else
375
376 // Cmpxchg instructions are often used with a subsequent comparison to
377 // determine whether it succeeded. We can exploit existing control-flow in
378 // ldrex/strex loops to simplify this, but it needs tidying up.
379 if (TM->getOptLevel() != CodeGenOptLevel::None && EnableAtomicTidy)
381 SimplifyCFGOptions().hoistCommonInsts(true).sinkCommonInsts(true),
382 [this](const Function &F) {
383 const auto &ST = this->TM->getSubtarget<ARMSubtarget>(F);
384 return ST.hasAnyDataBarrier() && !ST.isThumb1Only();
385 }));
386
389
391
392 // Run the parallel DSP pass.
393 if (getOptLevel() == CodeGenOptLevel::Aggressive)
394 addPass(createARMParallelDSPPass());
395
396 // Match complex arithmetic patterns
397 if (TM->getOptLevel() >= CodeGenOptLevel::Default)
399
400 // Match interleaved memory accesses to ldN/stN intrinsics.
401 if (TM->getOptLevel() != CodeGenOptLevel::None)
403
404 // Add Control Flow Guard checks.
405 if (TM->getTargetTriple().isOSWindows())
406 addPass(createCFGuardPass());
407
408 if (TM->Options.JMCInstrument)
409 addPass(createJMCInstrumenterPass());
410}
411
412void ARMPassConfig::addCodeGenPrepare() {
413 if (getOptLevel() != CodeGenOptLevel::None)
416}
417
418bool ARMPassConfig::addPreISel() {
419 if ((TM->getOptLevel() != CodeGenOptLevel::None &&
422 // FIXME: This is using the thumb1 only constant value for
423 // maximal global offset for merging globals. We may want
424 // to look into using the old value for non-thumb1 code of
425 // 4095 based on the TargetMachine, but this starts to become
426 // tricky when doing code gen per function.
427 bool OnlyOptimizeForSize =
428 (TM->getOptLevel() < CodeGenOptLevel::Aggressive) &&
430 // Merging of extern globals is enabled by default on non-Mach-O as we
431 // expect it to be generally either beneficial or harmless. On Mach-O it
432 // is disabled as we emit the .subsections_via_symbols directive which
433 // means that merging extern globals is not safe.
434 bool MergeExternalByDefault = !TM->getTargetTriple().isOSBinFormatMachO();
435 addPass(createGlobalMergePass(TM, 127, OnlyOptimizeForSize,
436 MergeExternalByDefault));
437 }
438
439 if (TM->getOptLevel() != CodeGenOptLevel::None) {
442 // FIXME: IR passes can delete address-taken basic blocks, deleting
443 // corresponding blockaddresses. ARMConstantPoolConstant holds references to
444 // address-taken basic blocks which can be invalidated if the function
445 // containing the blockaddress has already been codegen'd and the basic
446 // block is removed. Work around this by forcing all IR passes to run before
447 // any ISel takes place. We should have a more principled way of handling
448 // this. See D99707 for more details.
449 addPass(createBarrierNoopPass());
450 }
451
452 return false;
453}
454
455bool ARMPassConfig::addInstSelector() {
456 addPass(createARMISelDag(getARMTargetMachine(), getOptLevel()));
457 return false;
458}
459
460bool ARMPassConfig::addIRTranslator() {
461 addPass(new IRTranslator(getOptLevel()));
462 return false;
463}
464
465bool ARMPassConfig::addLegalizeMachineIR() {
466 addPass(new Legalizer());
467 return false;
468}
469
470bool ARMPassConfig::addRegBankSelect() {
471 addPass(new RegBankSelect());
472 return false;
473}
474
475bool ARMPassConfig::addGlobalInstructionSelect() {
476 addPass(new InstructionSelect(getOptLevel()));
477 return false;
478}
479
480void ARMPassConfig::addPreRegAlloc() {
481 if (getOptLevel() != CodeGenOptLevel::None) {
482 if (getOptLevel() == CodeGenOptLevel::Aggressive)
483 addPass(&MachinePipelinerID);
484
486
487 addPass(createMLxExpansionPass());
488
490 addPass(createARMLoadStoreOptLegacyPass(/* pre-register alloc */ true));
491
493 addPass(createA15SDOptimizerPass());
494 }
495}
496
497void ARMPassConfig::addPreSched2() {
498 if (getOptLevel() != CodeGenOptLevel::None) {
501
502 addPass(new ARMExecutionDomainFix());
504 }
505
506 // Expand some pseudo instructions into multiple instructions to allow
507 // proper scheduling.
508 addPass(createARMExpandPseudoPass());
509
510 // Emit KCFI checks for indirect calls.
511 addPass(createKCFIPass());
512
513 if (getOptLevel() != CodeGenOptLevel::None) {
514 // When optimising for size, always run the Thumb2SizeReduction pass before
515 // IfConversion. Otherwise, check whether IT blocks are restricted
516 // (e.g. in v8, IfConversion depends on Thumb instruction widths)
517 addPass(createThumb2SizeReductionPass([this](const Function &F) {
518 return this->TM->getSubtarget<ARMSubtarget>(F).hasMinSize() ||
519 this->TM->getSubtarget<ARMSubtarget>(F).restrictIT();
520 }));
521
522 addPass(createIfConverter([](const MachineFunction &MF) {
523 return !MF.getSubtarget<ARMSubtarget>().isThumb1Only();
524 }));
525 }
526 addPass(createThumb2ITBlockPass());
527
528 // Add both scheduling passes to give the subtarget an opportunity to pick
529 // between them.
530 if (getOptLevel() != CodeGenOptLevel::None) {
531 addPass(&PostMachineSchedulerID);
532 addPass(&PostRASchedulerID);
533 }
534
535 addPass(createMVEVPTBlockPass());
536 addPass(createARMIndirectThunks());
537 addPass(createARMSLSHardeningPass());
538}
539
540void ARMPassConfig::addPreEmitPass() {
542
543 // Unpack bundles for:
544 // - Thumb2: Constant island pass requires unbundled instructions
545 // - KCFI: KCFI_CHECK pseudo instructions need to be unbundled for AsmPrinter
547 return MF.getSubtarget<ARMSubtarget>().isThumb2() ||
548 MF.getFunction().getParent()->getModuleFlag("kcfi");
549 }));
550
551 // Don't optimize barriers or block placement at -O0.
552 if (getOptLevel() != CodeGenOptLevel::None) {
555 }
556}
557
558void ARMPassConfig::addPreEmitPass2() {
559
560 // Inserts fixup instructions before unsafe AES operations. Instructions may
561 // be inserted at the start of blocks and at within blocks so this pass has to
562 // come before those below.
564 // Inserts BTIs at the start of functions and indirectly-called basic blocks,
565 // so passes cannot add to the start of basic blocks once this has run.
567 // Inserts Constant Islands. Block sizes cannot be increased after this point,
568 // as this may push the branch ranges and load offsets of accessing constant
569 // pools out of range..
571 // Finalises Low-Overhead Loops. This replaces pseudo instructions with real
572 // instructions, but the pseudos all have conservative sizes so that block
573 // sizes will only be decreased by this pass.
575
576 if (TM->getTargetTriple().isOSWindows()) {
577 // Identify valid longjmp targets for Windows Control Flow Guard.
578 addPass(createCFGuardLongjmpPass());
579 // Identify valid eh continuation targets for Windows EHCont Guard.
581 }
582}
583
588
591 const auto *MFI = MF.getInfo<ARMFunctionInfo>();
592 return new yaml::ARMFunctionInfo(*MFI);
593}
594
597 SMDiagnostic &Error, SMRange &SourceRange) const {
598 const auto &YamlMFI = static_cast<const yaml::ARMFunctionInfo &>(MFI);
599 MachineFunction &MF = PFS.MF;
600 MF.getInfo<ARMFunctionInfo>()->initializeBaseYamlFields(YamlMFI);
601 return false;
602}
603
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static cl::opt< bool > EnableAtomicTidy("aarch64-enable-atomic-cfg-tidy", cl::Hidden, cl::desc("Run SimplifyCFG after expanding atomic operations" " to make use of cmpxchg flow-based information"), cl::init(true))
static std::unique_ptr< TargetLoweringObjectFile > createTLOF(const Triple &TT)
static Reloc::Model getEffectiveRelocModel()
static cl::opt< bool > DisableA15SDOptimization("disable-a15-sd-optimization", cl::Hidden, cl::desc("Inhibit optimization of S->D register accesses on A15"), cl::init(false))
static cl::opt< cl::boolOrDefault > EnableGlobalMerge("arm-global-merge", cl::Hidden, cl::desc("Enable the global merge pass"))
LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializeARMTarget()
static cl::opt< bool > EnableARMLoadStoreOpt("arm-load-store-opt", cl::Hidden, cl::desc("Enable ARM load/store optimization pass"), cl::init(true))
static cl::opt< bool > EnableAtomicTidy("arm-atomic-cfg-tidy", cl::Hidden, cl::desc("Run SimplifyCFG after expanding atomic operations" " to make use of cmpxchg flow-based information"), cl::init(true))
This file a TargetTransformInfoImplBase conforming object specific to the ARM target machine.
This file contains the simple types necessary to represent the attributes associated with functions a...
#define X(NUM, ENUM, NAME)
Definition ELF.h:856
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Provides analysis for continuously CSEing during GISel passes.
This file describes how to lower LLVM calls to machine code calls.
#define LLVM_ABI
Definition Compiler.h:215
#define LLVM_EXTERNAL_VISIBILITY
Definition Compiler.h:132
DXIL Legalizer
static RegisterPass< DebugifyModulePass > DM("debugify", "Attach debug info to everything")
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.
Module.h This file contains the declarations for the Module class.
Interface for Targets to specify which operations they can successfully select and how the others sho...
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define T
static PPCTargetMachine::PPCABI computeTargetABI(const Triple &TT, const TargetOptions &Options)
PowerPC VSX FMA Mutation
if(PassOpts->AAPipeline)
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC)
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition PassSupport.h:39
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")
Target-Independent Code Generator Pass Configuration Options pass.
This pass exposes codegen information to IR-level passes.
static std::unique_ptr< TargetLoweringObjectFile > createTLOF()
ARMBETargetMachine(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)
bool parseMachineFunctionInfo(const yaml::MachineFunctionInfo &, PerFunctionMIParsingState &PFS, SMDiagnostic &Error, SMRange &SourceRange) const override
Parse out the target's MachineFunctionInfo from the YAML reprsentation.
TargetPassConfig * createPassConfig(PassManagerBase &PM) override
Create a pass configuration object to be used by addPassToEmitX methods for generating a pipeline of ...
std::unique_ptr< TargetLoweringObjectFile > TLOF
void reset() override
Reset internal state.
ARMBaseTargetMachine(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)
Create an ARM architecture model.
MachineFunctionInfo * createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F, const TargetSubtargetInfo *STI) const override
Create the target's instance of MachineFunctionInfo.
yaml::MachineFunctionInfo * createDefaultFuncInfoYAML() const override
Allocate and return a default initialized instance of the YAML representation for the MachineFunction...
const ARMSubtarget * getSubtargetImpl() const =delete
ScheduleDAGInstrs * createMachineScheduler(MachineSchedContext *C) const override
Create an instance of ScheduleDAGInstrs to be run within the standard MachineScheduler pass for this ...
StringMap< std::unique_ptr< ARMSubtarget > > SubtargetMap
void registerPassBuilderCallbacks(PassBuilder &PB) override
Allow the target to modify the pass pipeline.
TargetTransformInfo getTargetTransformInfo(const Function &F) const override
Return a TargetTransformInfo for a given function.
ScheduleDAGInstrs * createPostMachineScheduler(MachineSchedContext *C) const override
Similar to createMachineScheduler but used when postRA machine scheduling is enabled.
yaml::MachineFunctionInfo * convertFuncInfoToYAML(const MachineFunction &MF) const override
Allocate and initialize an instance of the YAML representation of the MachineFunctionInfo.
ARMFunctionInfo - This class is derived from MachineFunctionInfo and contains private ARM-specific in...
ARMLETargetMachine(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)
Functions, function parameters, and return types can have attributes to indicate how they should be t...
Definition Attributes.h:105
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
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.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
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...
Metadata * getModuleFlag(StringRef Key) const
Return the corresponding value if Key appears in module flags, otherwise return null.
Definition Module.cpp:358
This class provides access to building LLVM's passes.
PassRegistry - This class manages the registration and intitialization of the pass subsystem as appli...
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
This pass implements the reg bank selector pass used in the GlobalISel pipeline.
A global registry used in conjunction with static constructors to make pluggable components (like tar...
Definition Registry.h:116
Instances of this class encapsulate one diagnostic report, allowing printing to a raw_ostream as a ca...
Definition SourceMgr.h:308
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...
void addMutation(std::unique_ptr< ScheduleDAGMutation > Mutation)
Add a postprocessing step to the DAG builder.
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
void setSupportsDebugEntryValues(bool Enable)
Triple TargetTriple
Triple string, CPU name, and target feature strings the TargetMachine instance is created with.
const Triple & getTargetTriple() const
void setMachineOutliner(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 void addIRPasses()
Add common target configurable passes that perform LLVM IR to IR transforms following machine indepen...
TargetSubtargetInfo - Generic base class for all target subtargets.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
PassManagerBase - An abstract interface to allow code to add passes to a pass manager without having ...
Interfaces for registering analysis passes, producing common pass manager configurations,...
Define some predicates that are used for node matching.
Definition ARMEHABI.h:25
@ DynamicNoPIC
Definition CodeGen.h:26
@ ARM
Windows AXP64.
Definition MCAsmInfo.h:50
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.
void initializeARMConstantIslandsPass(PassRegistry &)
LLVM_ABI FunctionPass * createCFGSimplificationPass(SimplifyCFGOptions Options=SimplifyCFGOptions(), std::function< bool(const Function &)> Ftor=nullptr)
FunctionPass * createMVETPAndVPTOptimisationsPass()
createMVETPAndVPTOptimisationsPass
Pass * createMVELaneInterleavingPass()
LLVM_ABI ModulePass * createJMCInstrumenterPass()
JMC instrument pass.
FunctionPass * createARMOptimizeBarriersPass()
createARMOptimizeBarriersPass - Returns an instance of the remove double barriers pass.
LLVM_ABI FunctionPass * createIfConverter(std::function< bool(const MachineFunction &)> Ftor)
LLVM_ABI FunctionPass * createTypePromotionLegacyPass()
Create IR Type Promotion pass.
void initializeMVETailPredicationPass(PassRegistry &)
void initializeMVELaneInterleavingPass(PassRegistry &)
Pass * createMVEGatherScatterLoweringPass()
Target & getTheThumbBETarget()
LLVM_ABI Pass * createGlobalMergePass(const TargetMachine *TM, unsigned MaximalOffset, bool OnlyOptimizeForSize=false, bool MergeExternalByDefault=false, bool MergeConstantByDefault=false, bool MergeConstAggressiveByDefault=false)
GlobalMerge - This pass merges internal (by default) globals into structs to enable reuse of a base p...
LLVM_ABI char & PostRASchedulerID
PostRAScheduler - This pass performs post register allocation scheduling.
LLVM_ABI Pass * createLowerAtomicPass()
FunctionPass * createARMISelDag(ARMBaseTargetMachine &TM, CodeGenOptLevel OptLevel)
createARMISelDag - This pass converts a legalized DAG into a ARM-specific DAG, ready for instruction ...
LLVM_ABI std::unique_ptr< CSEConfigBase > getStandardCSEConfigForOpt(CodeGenOptLevel Level)
Definition CSEInfo.cpp:85
FunctionPass * createARMLowOverheadLoopsPass()
LLVM_ABI char & PostMachineSchedulerID
PostMachineScheduler - This pass schedules machine instructions postRA.
void initializeARMPreAllocLoadStoreOptLegacyPass(PassRegistry &)
FunctionPass * createARMBranchTargetsPass()
LLVM_ABI void initializeMachineKCFILegacyPass(PassRegistry &)
LLVM_ABI FunctionPass * createUnpackMachineBundlesLegacy(std::function< bool(const MachineFunction &)> Ftor)
static Reloc::Model getEffectiveRelocModel(std::optional< Reloc::Model > RM)
std::unique_ptr< ScheduleDAGMutation > createARMLatencyMutations(const ARMSubtarget &ST, AAResults *AA)
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.
ScheduleDAGMI * createSchedPostRA(MachineSchedContext *C)
Create a generic scheduler with no vreg liveness or DAG mutation passes.
void initializeARMBranchTargetsPass(PassRegistry &)
Pass * createMVETailPredicationPass()
LLVM_ABI FunctionPass * createKCFIPass()
Lowers KCFI operand bundles for indirect calls.
Definition KCFI.cpp:75
LLVM_ABI FunctionPass * createComplexDeinterleavingPass(const TargetMachine *TM)
This pass implements generation of target-specific intrinsics to support handling of complex number a...
FunctionPass * createARMBlockPlacementPass()
std::unique_ptr< ScheduleDAGMutation > createARMMacroFusionDAGMutation()
Note that you have to add: DAG.addMutation(createARMMacroFusionDAGMutation()); to ARMTargetMachine::c...
void initializeARMParallelDSPPass(PassRegistry &)
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:149
@ Default
-O2, -Os, -Oz
Definition CodeGen.h:152
FunctionPass * createARMLoadStoreOptLegacyPass(bool PreAlloc=false)
Returns an instance of the load / store optimization pass.
LLVM_ABI FunctionPass * createCFGuardLongjmpPass()
Creates CFGuard longjmp target identification pass.
void initializeARMExpandPseudoPass(PassRegistry &)
FunctionPass * createA15SDOptimizerPass()
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
void initializeARMSLSHardeningPass(PassRegistry &)
LLVM_ABI FunctionPass * createInterleavedAccessPass()
InterleavedAccess Pass - This pass identifies and matches interleaved memory accesses to target speci...
LLVM_ABI void initializeGlobalISel(PassRegistry &)
Initialize all passes linked into the GlobalISel library.
void initializeARMAsmPrinterPass(PassRegistry &)
LLVM_ABI FunctionPass * createCFGuardPass()
Insert Control Flow Guard checks on indirect function calls.
Definition CFGuard.cpp:316
void initializeARMLoadStoreOptLegacyPass(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.
FunctionPass * createARMSLSHardeningPass()
FunctionPass * createARMConstantIslandPass()
createARMConstantIslandPass - returns an instance of the constpool island pass.
void initializeARMLowOverheadLoopsPass(PassRegistry &)
void initializeMVETPAndVPTOptimisationsPass(PassRegistry &)
void initializeARMExecutionDomainFixPass(PassRegistry &)
LLVM_ABI FunctionPass * createEHContGuardTargetsPass()
Creates Windows EH Continuation Guard target identification pass.
void initializeThumb2SizeReducePass(PassRegistry &)
FunctionPass * createThumb2ITBlockPass()
createThumb2ITBlockPass - Returns an instance of the Thumb2 IT blocks insertion pass.
void initializeMVEGatherScatterLoweringPass(PassRegistry &)
FunctionPass * createARMExpandPseudoPass()
createARMExpandPseudoPass - returns an instance of the pseudo instruction expansion pass.
FunctionPass * createARMIndirectThunks()
void initializeARMFixCortexA57AES1742098Pass(PassRegistry &)
FunctionPass * createARMFixCortexA57AES1742098Pass()
Pass * createARMParallelDSPPass()
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:390
FunctionPass * createThumb2SizeReductionPass(std::function< bool(const Function &)> Ftor=nullptr)
createThumb2SizeReductionPass - Returns an instance of the Thumb2 size reduction pass.
Target & getTheARMLETarget()
LLVM_ABI FunctionPass * createBreakFalseDepsLegacyPass()
Creates Break False Dependencies pass.
void initializeMVEVPTBlockPass(PassRegistry &)
void initializeARMDAGToDAGISelLegacyPass(PassRegistry &)
FunctionPass * createMLxExpansionPass()
void initializeARMBlockPlacementPass(PassRegistry &)
LLVM_ABI FunctionPass * createHardwareLoopsLegacyPass()
Create Hardware Loop pass.
Target & getTheARMBETarget()
Target & getTheThumbLETarget()
FunctionPass * createMVEVPTBlockPass()
createMVEVPTBlock - Returns an instance of the MVE VPT block insertion pass.
Represent subnormal handling kind for floating point instruction inputs and outputs.
static constexpr DenormalMode getIEEE()
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...
RegisterTargetMachine - Helper template for registering a target machine implementation,...
Targets should override this in a way that mirrors the implementation of llvm::MachineFunctionInfo.