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"
34#include "llvm/CodeGen/Passes.h"
36#include "llvm/IR/Attributes.h"
37#include "llvm/IR/CallingConv.h"
38#include "llvm/IR/DataLayout.h"
40#include "llvm/IR/Function.h"
42#include "llvm/IR/InstrTypes.h"
43#include "llvm/IR/Module.h"
45#include "llvm/Pass.h"
56#include "llvm/Transforms/IPO.h"
58#include <cassert>
59#include <memory>
60#include <optional>
61#include <string>
62
63using namespace llvm;
64
65static cl::opt<bool>
66DisableA15SDOptimization("disable-a15-sd-optimization", cl::Hidden,
67 cl::desc("Inhibit optimization of S->D register accesses on A15"),
68 cl::init(false));
69
70static cl::opt<bool>
71EnableAtomicTidy("arm-atomic-cfg-tidy", cl::Hidden,
72 cl::desc("Run SimplifyCFG after expanding atomic operations"
73 " to make use of cmpxchg flow-based information"),
74 cl::init(true));
75
76static cl::opt<bool>
77EnableARMLoadStoreOpt("arm-load-store-opt", cl::Hidden,
78 cl::desc("Enable ARM load/store optimization pass"),
79 cl::init(true));
80
81// FIXME: Unify control over GlobalMerge.
83EnableGlobalMerge("arm-global-merge", cl::Hidden,
84 cl::desc("Enable the global merge pass"));
85
116
117static std::unique_ptr<TargetLoweringObjectFile> createTLOF(const Triple &TT) {
118 if (TT.isOSBinFormatMachO())
119 return std::make_unique<TargetLoweringObjectFileMachO>();
120 if (TT.isOSWindows())
121 return std::make_unique<TargetLoweringObjectFileCOFF>();
122 return std::make_unique<ARMElfTargetObjectFile>();
123}
124
126 std::optional<Reloc::Model> RM) {
127 if (!RM)
128 // Default relocation model on Darwin is PIC.
129 return TT.isOSBinFormatMachO() ? Reloc::PIC_ : Reloc::Static;
130
131 if (*RM == Reloc::ROPI || *RM == Reloc::RWPI || *RM == Reloc::ROPI_RWPI)
132 assert(TT.isOSBinFormatELF() &&
133 "ROPI/RWPI currently only supported for ELF");
134
135 // DynamicNoPIC is only used on darwin.
136 if (*RM == Reloc::DynamicNoPIC && !TT.isOSDarwin())
137 return Reloc::Static;
138
139 return *RM;
140}
141
142/// Create an ARM architecture model.
143///
145 StringRef CPU, StringRef FS,
146 const TargetOptions &Options,
147 std::optional<Reloc::Model> RM,
148 std::optional<CodeModel::Model> CM,
150 : CodeGenTargetMachineImpl(T, TT, CPU, FS, Options,
152 getEffectiveCodeModel(CM, CodeModel::Small), OL),
154
155 if (TT.isOSBinFormatMachO()) {
156 this->Options.TrapUnreachable = true;
157 this->Options.NoTrapAfterNoreturn = true;
158 }
159
160 // ARM supports the debug entry values.
162
163 initAsmInfo();
164
166
167 // ARM supports the MachineOutliner.
168 setMachineOutliner(true);
170}
171
173
175 BumpPtrAllocator &Allocator, const Function &F,
176 const TargetSubtargetInfo *STI) const {
177 const auto *ARMSTI = static_cast<const ARMSubtarget *>(STI);
178 if (!ARMSTI->hasFPRegs() || ARMSTI->isThumb1Only() ||
179 ARMSTI->useSoftFloat()) {
180 const StringRef FPRegsUnavailableMsg =
181 ", but floating-point registers are unavailable";
182 const ARMTargetLowering *TLI = ARMSTI->getTargetLowering();
183
184 if (TLI->getEffectiveCallingConv(F.getCallingConv(), F.isVarArg()) ==
186 F.getContext().diagnose(DiagnosticInfoUnsupported(
187 F, Twine("calling convention is hard-float") + FPRegsUnavailableMsg,
188 DiagnosticLocation(F.getSubprogram())));
189 } else {
190 for (const Instruction &I : instructions(F)) {
191 const auto *CB = dyn_cast<CallBase>(&I);
192 if (!CB || CB->isInlineAsm() ||
193 (CB->getCalledFunction() && CB->getCalledFunction()->isIntrinsic()))
194 continue;
195 if (TLI->getEffectiveCallingConv(CB->getCallingConv(),
196 CB->getFunctionType()->isVarArg()) ==
198 const Function *Callee = CB->getCalledFunction();
199 F.getContext().diagnose(DiagnosticInfoUnsupported(
200 F,
201 (Callee ? Twine("'") + F.getName() + "' calls '" +
202 Callee->getName() + "', which"
203 : Twine("'") + F.getName() +
204 "' makes an indirect call that") +
205 " expects a hard-float calling convention" +
206 FPRegsUnavailableMsg,
207 CB->getDebugLoc()));
208 }
209 }
210 }
211 }
212 return ARMFunctionInfo::create<ARMFunctionInfo>(Allocator, F, ARMSTI);
213}
214
216 // An explicit "float-abi" module flag always wins, even for AAPCS16.
217 if (auto *Val = dyn_cast_or_null<MDString>(M.getModuleFlag("float-abi")))
218 return *FloatABI::parseABIType(Val->getString());
219 return M.getTargetTriple().getDefaultFloatABI(getTargetABIName(M));
220}
221
223 // Consistency of "target-abi" and -target-abi is validated elsewhere.
224 if (const auto *MD = cast_or_null<MDString>(M.getModuleFlag("target-abi")))
225 return ARM::computeTargetABI(TargetTriple, MD->getString());
226 return ARM::computeTargetABI(TargetTriple, Options.MCOptions.getABIName());
227}
228
229const ARMSubtarget *
231 Attribute CPUAttr = F.getFnAttribute("target-cpu");
232 Attribute FSAttr = F.getFnAttribute("target-features");
233
234 std::string CPU =
235 CPUAttr.isValid() ? CPUAttr.getValueAsString().str() : TargetCPU;
236 std::string FS =
237 FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS;
238
239 // FIXME: This is related to the code below to reset the target options,
240 // we need to know whether or not the soft float flag is set on the
241 // function before we can generate a subtarget. We also need to use
242 // it as a key for the subtarget since that can be the only difference
243 // between two functions.
244 bool SoftFloat = F.getFnAttribute("use-soft-float").getValueAsBool();
245 // If the soft float attribute is set on the function turn on the soft float
246 // subtarget feature.
247 if (SoftFloat)
248 FS += FS.empty() ? "+soft-float" : ",+soft-float";
249
250 // Use the optminsize to identify the subtarget, but don't use it in the
251 // feature string.
252 std::string Key = CPU + FS;
253 if (F.hasMinSize())
254 Key += "+minsize";
255
256 DenormalMode DM = F.getDenormalFPEnv().DefaultMode;
257 if (DM != DenormalMode::getIEEE())
258 Key += "denormal-fp-math=" + DM.str();
259
260 FloatABI::ABIType FloatABI = getFloatABI(*F.getParent());
261 // It is legal to have FloatABI::Hard for targets with SIMD registers
262 // but no floating-point hardware (mve+nofp).
263 Key += FloatABI == FloatABI::Hard ? "+hard-float-abi" : "+soft-float-abi";
264
265 ARM::ARMABI ABI = getEffectiveABI(*F.getParent());
266 Key += "+abi=" + std::to_string((int)ABI);
267
268 auto &I = SubtargetMap[Key];
269 if (!I) {
270 I = std::make_unique<ARMSubtarget>(TargetTriple, CPU, FS, *this, isLittle,
271 FloatABI, ABI, F.hasMinSize(), DM);
272
273 if (!I->isThumb() && !I->hasARMOps())
274 F.getContext().emitError("Function '" + F.getName() + "' uses ARM "
275 "instructions, but the target does not support ARM mode execution.");
276 }
277
278 return I.get();
279}
280
283 return TargetTransformInfo(std::make_unique<ARMTTIImpl>(this, F));
284}
285
289 // add DAG Mutations here.
290 const ARMSubtarget &ST = C->MF->getSubtarget<ARMSubtarget>();
291 if (ST.hasFusion())
293 return DAG;
294}
295
299 // add DAG Mutations here.
300 const ARMSubtarget &ST = C->MF->getSubtarget<ARMSubtarget>();
301 if (ST.hasFusion())
303 if (auto Mutation = createARMLatencyMutations(ST, C->AA))
304 DAG->addMutation(std::move(Mutation));
305 return DAG;
306}
307
309 StringRef CPU, StringRef FS,
310 const TargetOptions &Options,
311 std::optional<Reloc::Model> RM,
312 std::optional<CodeModel::Model> CM,
313 CodeGenOptLevel OL, bool JIT)
314 : ARMBaseTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL) {}
315
317 StringRef CPU, StringRef FS,
318 const TargetOptions &Options,
319 std::optional<Reloc::Model> RM,
320 std::optional<CodeModel::Model> CM,
321 CodeGenOptLevel OL, bool JIT)
322 : ARMBaseTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL) {}
323
324namespace {
325
326/// ARM Code Generator Pass Configuration Options.
327class ARMPassConfig : public TargetPassConfig {
328public:
329 ARMPassConfig(ARMBaseTargetMachine &TM, PassManagerBase &PM)
330 : TargetPassConfig(TM, PM) {}
331
332 ARMBaseTargetMachine &getARMTargetMachine() const {
334 }
335
336 void addIRPasses() override;
337 void addCodeGenPrepare() override;
338 bool addPreISel() override;
339 bool addInstSelector() override;
340 bool addIRTranslator() override;
341 bool addLegalizeMachineIR() override;
342 bool addRegBankSelect() override;
343 bool addGlobalInstructionSelect() override;
344 void addPreRegAlloc() override;
345 bool isMachinePipelinerEnabled() const override {
346 return getOptLevel() == CodeGenOptLevel::Aggressive;
347 }
348 void addPreSched2() override;
349 void addPreEmitPass() override;
350 void addPreEmitPass2() override;
351
352 std::unique_ptr<CSEConfigBase> getCSEConfig() const override;
353};
354
355} // end anonymous namespace
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() {
372
373 // Cmpxchg instructions are often used with a subsequent comparison to
374 // determine whether it succeeded. We can exploit existing control-flow in
375 // ldrex/strex loops to simplify this, but it needs tidying up.
376 if (TM->getOptLevel() != CodeGenOptLevel::None && EnableAtomicTidy)
378 SimplifyCFGOptions().hoistCommonInsts(true).sinkCommonInsts(true),
379 [this](const Function &F) {
380 const auto &ST = this->TM->getSubtarget<ARMSubtarget>(F);
381 return ST.hasAnyDataBarrier() && !ST.isThumb1Only();
382 }));
383
386
388
389 // Run the parallel DSP pass.
390 if (getOptLevel() == CodeGenOptLevel::Aggressive)
391 addPass(createARMParallelDSPPass());
392
393 // Match complex arithmetic patterns
394 if (TM->getOptLevel() >= CodeGenOptLevel::Default)
396
397 // Match interleaved memory accesses to ldN/stN intrinsics.
398 if (TM->getOptLevel() != CodeGenOptLevel::None)
400
401 // Add Control Flow Guard checks.
402 if (TM->getTargetTriple().isOSWindows())
403 addPass(createCFGuardPass());
404
405 if (TM->Options.JMCInstrument)
406 addPass(createJMCInstrumenterPass());
407}
408
409void ARMPassConfig::addCodeGenPrepare() {
410 if (getOptLevel() != CodeGenOptLevel::None)
413}
414
415bool ARMPassConfig::addPreISel() {
416 if ((TM->getOptLevel() != CodeGenOptLevel::None &&
419 // FIXME: This is using the thumb1 only constant value for
420 // maximal global offset for merging globals. We may want
421 // to look into using the old value for non-thumb1 code of
422 // 4095 based on the TargetMachine, but this starts to become
423 // tricky when doing code gen per function.
424 bool OnlyOptimizeForSize =
425 (TM->getOptLevel() < CodeGenOptLevel::Aggressive) &&
427 // Merging of extern globals is enabled by default on non-Mach-O as we
428 // expect it to be generally either beneficial or harmless. On Mach-O it
429 // is disabled as we emit the .subsections_via_symbols directive which
430 // means that merging extern globals is not safe.
431 bool MergeExternalByDefault = !TM->getTargetTriple().isOSBinFormatMachO();
432 addPass(createGlobalMergePass(TM, 127, OnlyOptimizeForSize,
433 MergeExternalByDefault));
434 }
435
436 if (TM->getOptLevel() != CodeGenOptLevel::None) {
439 // FIXME: IR passes can delete address-taken basic blocks, deleting
440 // corresponding blockaddresses. ARMConstantPoolConstant holds references to
441 // address-taken basic blocks which can be invalidated if the function
442 // containing the blockaddress has already been codegen'd and the basic
443 // block is removed. Work around this by forcing all IR passes to run before
444 // any ISel takes place. We should have a more principled way of handling
445 // this. See D99707 for more details.
446 addPass(createBarrierNoopPass());
447 }
448
449 return false;
450}
451
452bool ARMPassConfig::addInstSelector() {
453 addPass(createARMISelDag(getARMTargetMachine(), getOptLevel()));
454 return false;
455}
456
457bool ARMPassConfig::addIRTranslator() {
458 addPass(new IRTranslatorLegacy(getOptLevel()));
459 return false;
460}
461
462bool ARMPassConfig::addLegalizeMachineIR() {
463 addPass(new LegalizerLegacy());
464 return false;
465}
466
467bool ARMPassConfig::addRegBankSelect() {
468 addPass(new RegBankSelectLegacy());
469 return false;
470}
471
472bool ARMPassConfig::addGlobalInstructionSelect() {
473 addPass(new InstructionSelectLegacy(getOptLevel()));
474 return false;
475}
476
477void ARMPassConfig::addPreRegAlloc() {
478 if (getOptLevel() != CodeGenOptLevel::None) {
480
481 addPass(createMLxExpansionPass());
482
484 addPass(createARMLoadStoreOptLegacyPass(/* pre-register alloc */ true));
485
487 addPass(createA15SDOptimizerPass());
488 }
489}
490
491void ARMPassConfig::addPreSched2() {
492 if (getOptLevel() != CodeGenOptLevel::None) {
495
498 }
499
500 // Expand some pseudo instructions into multiple instructions to allow
501 // proper scheduling.
502 addPass(createARMExpandPseudoPass());
503
504 // Emit KCFI checks for indirect calls.
505 addPass(createKCFIPass());
506
507 if (getOptLevel() != CodeGenOptLevel::None) {
508 // When optimising for size, always run the Thumb2SizeReduction pass before
509 // IfConversion. Otherwise, check whether IT blocks are restricted
510 // (e.g. in v8, IfConversion depends on Thumb instruction widths)
511 addPass(createThumb2SizeReductionPass([this](const Function &F) {
512 return this->TM->getSubtarget<ARMSubtarget>(F).hasMinSize() ||
513 this->TM->getSubtarget<ARMSubtarget>(F).restrictIT();
514 }));
515
516 addPass(createIfConverterLegacyPass([](const MachineFunction &MF) {
517 return !MF.getSubtarget<ARMSubtarget>().isThumb1Only();
518 }));
519 }
520 addPass(createThumb2ITBlockPass());
521
522 // Add both scheduling passes to give the subtarget an opportunity to pick
523 // between them.
524 if (getOptLevel() != CodeGenOptLevel::None) {
525 addPass(&PostMachineSchedulerID);
526 addPass(&PostRASchedulerID);
527 }
528
529 addPass(createMVEVPTBlockPass());
530 addPass(createARMIndirectThunks());
531 addPass(createARMSLSHardeningPass());
532}
533
534void ARMPassConfig::addPreEmitPass() {
536
537 // Unpack bundles for:
538 // - Thumb2: Constant island pass requires unbundled instructions
539 // - KCFI: KCFI_CHECK pseudo instructions need to be unbundled for AsmPrinter
541 return MF.getSubtarget<ARMSubtarget>().isThumb2() ||
542 MF.getFunction().getParent()->getModuleFlag("kcfi");
543 }));
544
545 // Don't optimize barriers or block placement at -O0.
546 if (getOptLevel() != CodeGenOptLevel::None) {
549 }
550}
551
552void ARMPassConfig::addPreEmitPass2() {
553
554 // Inserts fixup instructions before unsafe AES operations. Instructions may
555 // be inserted at the start of blocks and at within blocks so this pass has to
556 // come before those below.
558 // Inserts BTIs at the start of functions and indirectly-called basic blocks,
559 // so passes cannot add to the start of basic blocks once this has run.
561 // Inserts Constant Islands. Block sizes cannot be increased after this point,
562 // as this may push the branch ranges and load offsets of accessing constant
563 // pools out of range..
565 // Finalises Low-Overhead Loops. This replaces pseudo instructions with real
566 // instructions, but the pseudos all have conservative sizes so that block
567 // sizes will only be decreased by this pass.
569
570 if (TM->getTargetTriple().isOSWindows()) {
571 // Identify valid longjmp targets for Windows Control Flow Guard.
573 // Identify valid eh continuation targets for Windows EHCont Guard.
575 }
576}
577
582
585 const auto *MFI = MF.getInfo<ARMFunctionInfo>();
586 return new yaml::ARMFunctionInfo(*MFI);
587}
588
591 SMDiagnostic &Error, SMRange &SourceRange) const {
592 const auto &YamlMFI = static_cast<const yaml::ARMFunctionInfo &>(MFI);
593 MachineFunction &MF = PFS.MF;
594 MF.getInfo<ARMFunctionInfo>()->initializeBaseYamlFields(YamlMFI);
595 return false;
596}
597
const TargetLowering & TLI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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.
Expand Atomic instructions
This file contains the simple types necessary to represent the attributes associated with functions a...
#define X(NUM, ENUM, NAME)
Definition ELF.h:665
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:211
#define LLVM_EXTERNAL_VISIBILITY
Definition Compiler.h:132
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
PowerPC VSX FMA Mutation
PassBuilder PB(Mod->getContext(), Machine, PassOpts->PTO, std::nullopt, &PIC)
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.
void registerPassBuilderCallbacks(PassBuilder &PB) override
Allow the target to modify the pass pipeline.
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
ARM::ARMABI getEffectiveABI(const Module &M) const
Returns the ABI in effect for M: the "target-abi" module flag if present, otherwise the legacy -targe...
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
FloatABI::ABIType getFloatABI(const Module &M) const
Returns the floating-point ABI in effect for M: the "float-abi" module flag if present,...
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
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:106
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:262
CodeGenTargetMachineImpl(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, Reloc::Model RM, CodeModel::Model CM, CodeGenOptLevel OL)
Diagnostic information for unsupported feature in backend.
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.
static void setUseExtended(bool Enable)
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...
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
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:307
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)
StringRef getTargetABIName(const Module &M) const
Returns the effective target ABI name: the "target-abi" module flag if present, otherwise the -target...
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
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
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,...
LLVM_ABI LLVM_READONLY ARMABI computeTargetABI(const Triple &TT, StringRef ABIName="")
@ ARM_AAPCS_VFP
Same as ARM_AAPCS, but uses hard floating point ABI.
std::optional< ABIType > parseABIType(StringRef S)
Parse the string spelling used by the "float-abi" IR module flag into an ABIType.
Definition CodeGen.h:167
@ DynamicNoPIC
Definition CodeGen.h:26
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 * createTypePromotionLegacyPass()
Create IR Type Promotion pass.
LLVM_ABI FunctionPass * createIfConverterLegacyPass(std::function< bool(const MachineFunction &)> Ftor)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
void initializeMVETailPredicationPass(PassRegistry &)
void initializeMVELaneInterleavingPass(PassRegistry &)
Pass * createMVEGatherScatterLoweringPass()
LLVM_ABI FunctionPass * createEHContGuardTargetsLegacy()
Creates Windows EH Continuation Guard target identification pass.
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 FunctionPass * createExecutionDomainFixLegacyPass()
Minimizes execution domain crossings for specific register classes.
auto cast_or_null(const Y &Val)
Definition Casting.h:714
LLVM_ABI char & PostRASchedulerID
PostRAScheduler - This pass performs post register allocation scheduling.
FunctionPass * createARMISelDag(ARMBaseTargetMachine &TM, CodeGenOptLevel OptLevel)
createARMISelDag - This pass converts a legalized DAG into a ARM-specific DAG, ready for instruction ...
LLVM_ABI FunctionPass * createCFGuardLongjmpLegacyPass()
Creates CFGuard longjmp target identification pass.
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()
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
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:280
@ Default
-O2, -Os, -Oz
Definition CodeGen.h:283
FunctionPass * createARMLoadStoreOptLegacyPass(bool PreAlloc=false)
Returns an instance of the load / store optimization pass.
void initializeARMExpandPseudoPass(PassRegistry &)
FunctionPass * createA15SDOptimizerPass()
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
void initializeARMSLSHardeningPass(PassRegistry &)
void initializeThumb2ITBlockPass(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:314
void initializeARMLoadStoreOptLegacyPass(PassRegistry &)
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 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:391
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.