LLVM 23.0.0git
AArch64Subtarget.cpp
Go to the documentation of this file.
1//===-- AArch64Subtarget.cpp - AArch64 Subtarget Information ----*- C++ -*-===//
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// This file implements the AArch64 specific subclass of TargetSubtarget.
10//
11//===----------------------------------------------------------------------===//
12
13#include "AArch64Subtarget.h"
14
15#include "AArch64.h"
16#include "AArch64InstrInfo.h"
17#include "AArch64PBQPRegAlloc.h"
26#include "llvm/IR/GlobalValue.h"
29
30using namespace llvm;
31
32#define DEBUG_TYPE "aarch64-subtarget"
33
34#define GET_SUBTARGETINFO_CTOR
35#define GET_SUBTARGETINFO_TARGET_DESC
36#include "AArch64GenSubtargetInfo.inc"
37
38static cl::opt<bool>
39EnableEarlyIfConvert("aarch64-early-ifcvt", cl::desc("Enable the early if "
40 "converter pass"), cl::init(true), cl::Hidden);
41
42// If OS supports TBI, use this flag to enable it.
43static cl::opt<bool>
44UseAddressTopByteIgnored("aarch64-use-tbi", cl::desc("Assume that top byte of "
45 "an address is ignored"), cl::init(false), cl::Hidden);
46
48 "aarch64-macho-enable-nonlazybind",
49 cl::desc("Call nonlazybind functions via direct GOT load for Mach-O"),
51
52static cl::opt<bool> UseAA("aarch64-use-aa", cl::init(true),
53 cl::desc("Enable the use of AA during codegen."));
54
56 "aarch64-insert-extract-base-cost",
57 cl::desc("Base cost of vector insert/extract element"), cl::Hidden);
58
59// Reserve a list of X# registers, so they are unavailable for register
60// allocator, but can still be used as ABI requests, such as passing arguments
61// to function call.
63ReservedRegsForRA("reserve-regs-for-regalloc", cl::desc("Reserve physical "
64 "registers, so they can't be used by register allocator. "
65 "Should only be used for testing register allocator."),
67
69 AuthenticatedLRCheckMethod("aarch64-authenticated-lr-check-method",
71 cl::desc("Override the variant of check applied "
72 "to authenticated LR during tail call"),
74
76 "aarch64-min-jump-table-entries", cl::init(10), cl::Hidden,
77 cl::desc("Set minimum number of entries to use a jump table on AArch64"));
78
80 "aarch64-streaming-hazard-size",
81 cl::desc("Hazard size for streaming mode memory accesses. 0 = disabled."),
83
85 "aarch64-stack-hazard-size",
86 cl::desc("alias for -aarch64-streaming-hazard-size"),
88
90 VScaleForTuningOpt("sve-vscale-for-tuning", cl::Hidden,
91 cl::desc("Force a vscale for tuning factor for SVE"));
92
93// Subreg liveness tracking is disabled by default for now until all issues
94// are ironed out. This option allows the feature to be used in tests.
95static cl::opt<bool>
96 EnableSubregLivenessTracking("aarch64-enable-subreg-liveness-tracking",
97 cl::init(false), cl::Hidden,
98 cl::desc("Enable subreg liveness tracking"));
99
100static cl::opt<bool>
101 UseScalarIncVL("sve-use-scalar-inc-vl", cl::init(false), cl::Hidden,
102 cl::desc("Prefer add+cnt over addvl/inc/dec"));
103
109
110AArch64Subtarget &AArch64Subtarget::initializeSubtargetDependencies(
111 StringRef FS, StringRef CPUString, StringRef TuneCPUString,
112 bool HasMinSize) {
113 // Determine default and user-specified characteristics
114
115 if (CPUString.empty())
116 CPUString = "generic";
117
118 if (TuneCPUString.empty())
119 TuneCPUString = CPUString;
120
121 ParseSubtargetFeatures(CPUString, TuneCPUString, FS);
122 initializeProperties(HasMinSize);
123
124 return *this;
125}
126
127void AArch64Subtarget::initializeProperties(bool HasMinSize) {
128 // Initialize CPU specific properties. We should add a tablegen feature for
129 // this in the future so we can specify it together with the subtarget
130 // features.
131 switch (ARMProcFamily) {
132 case Generic:
133 // Using TuneCPU=generic we avoid ldapur instructions to line up with the
134 // cpus that use the AvoidLDAPUR feature. We don't want this to be on
135 // forever, so it is enabled between armv8.4 and armv8.7/armv9.2.
136 if (hasV8_4aOps() && !hasV8_8aOps())
137 AvoidLDAPUR = true;
138 break;
139 case Carmel:
140 CacheLineSize = 64;
141 break;
142 case CortexA35:
143 case CortexA53:
144 case CortexA55:
145 case CortexR82:
146 case CortexR82AE:
150 break;
151 case CortexA57:
155 break;
156 case CortexA65:
158 break;
159 case CortexA72:
160 case CortexA73:
161 case CortexA75:
165 break;
166 case CortexA76:
167 case CortexA77:
168 case CortexA78:
169 case CortexA78AE:
170 case CortexA78C:
171 case CortexX1:
175 break;
176 case CortexA320:
177 case CortexA510:
178 case CortexA520:
179 case C1Nano:
181 VScaleForTuning = 1;
184 break;
185 case CortexA710:
186 case CortexA715:
187 case CortexA720:
188 case CortexA725:
189 case C1Pro:
190 case CortexX2:
191 case CortexX3:
192 case CortexX4:
193 case CortexX925:
194 case C1Premium:
195 case C1Ultra:
197 VScaleForTuning = 1;
200 break;
201 case A64FX:
202 CacheLineSize = 256;
205 PrefetchDistance = 128;
206 MinPrefetchStride = 1024;
208 VScaleForTuning = 4;
209 break;
210 case MONAKA:
211 VScaleForTuning = 2;
212 break;
213 case AppleA7:
214 case AppleA10:
215 case AppleA11:
216 case AppleA12:
217 case AppleA13:
218 case AppleA14:
219 case AppleA15:
220 case AppleA16:
221 case AppleA17:
222 case AppleM4:
223 case AppleM5:
224 CacheLineSize = 64;
225 PrefetchDistance = 280;
226 MinPrefetchStride = 2048;
228 break;
229 case ExynosM3:
230 MaxJumpTableSize = 20;
233 break;
234 case Falkor:
235 // FIXME: remove this to enable 64-bit SLP if performance looks good.
237 CacheLineSize = 128;
238 PrefetchDistance = 820;
239 MinPrefetchStride = 2048;
241 break;
242 case Kryo:
244 CacheLineSize = 128;
245 PrefetchDistance = 740;
246 MinPrefetchStride = 1024;
248 // FIXME: remove this to enable 64-bit SLP if performance looks good.
250 break;
251 case NeoverseE1:
253 break;
254 case NeoverseN1:
258 break;
259 case NeoverseV2:
260 case NeoverseV3:
261 CacheLineSize = 64;
263 ScatterOverhead = 13;
264 [[fallthrough]];
265 case NeoverseN2:
266 case NeoverseN3:
270 VScaleForTuning = 1;
271 break;
272 case NeoverseV1:
276 VScaleForTuning = 2;
278 break;
279 case Neoverse512TVB:
281 VScaleForTuning = 1;
282 break;
283 case Saphira:
284 // FIXME: remove this to enable 64-bit SLP if performance looks good.
286 break;
287 case ThunderX2T99:
288 CacheLineSize = 64;
291 PrefetchDistance = 128;
292 MinPrefetchStride = 1024;
294 // FIXME: remove this to enable 64-bit SLP if performance looks good.
296 break;
297 case ThunderX:
298 case ThunderXT88:
299 case ThunderXT81:
300 case ThunderXT83:
301 CacheLineSize = 128;
304 // FIXME: remove this to enable 64-bit SLP if performance looks good.
306 break;
307 case TSV110:
308 CacheLineSize = 64;
311 break;
312 case ThunderX3T110:
313 CacheLineSize = 64;
316 PrefetchDistance = 128;
317 MinPrefetchStride = 1024;
319 // FIXME: remove this to enable 64-bit SLP if performance looks good.
321 break;
322 case Ampere1:
323 case Ampere1A:
324 case Ampere1B:
325 case Ampere1C:
326 CacheLineSize = 64;
329 break;
330 case Oryon:
331 CacheLineSize = 64;
333 PrefetchDistance = 128;
334 MinPrefetchStride = 1024;
335 break;
336 case Olympus:
338 ScatterOverhead = 13;
342 VScaleForTuning = 1;
343 break;
344 }
345
346 if (AArch64MinimumJumpTableEntries.getNumOccurrences() > 0 || !HasMinSize)
348 if (VScaleForTuningOpt.getNumOccurrences() > 0)
350}
351
353 StringRef TuneCPU, StringRef FS,
354 const TargetMachine &TM, bool LittleEndian,
355 unsigned MinSVEVectorSizeInBitsOverride,
356 unsigned MaxSVEVectorSizeInBitsOverride,
358 bool HasMinSize,
360 : AArch64GenSubtargetInfo(TT, CPU, TuneCPU, FS),
361 ReserveXRegister(AArch64::GPR64commonRegClass.getNumRegs()),
362 ReserveXRegisterForRA(AArch64::GPR64commonRegClass.getNumRegs()),
363 CustomCallSavedXRegs(AArch64::GPR64commonRegClass.getNumRegs()),
364 IsLittle(LittleEndian), IsStreaming(IsStreaming),
367 AArch64StreamingHazardSize.getNumOccurrences() > 0
369 : std::nullopt),
370 MinSVEVectorSizeInBits(MinSVEVectorSizeInBitsOverride),
371 MaxSVEVectorSizeInBits(MaxSVEVectorSizeInBitsOverride),
373 TargetTriple(TT),
374 InstrInfo(initializeSubtargetDependencies(FS, CPU, TuneCPU, HasMinSize)),
375 TLInfo(TM, *this) {
377 ReserveXRegister.set(18);
378
381 Legalizer.reset(new AArch64LegalizerInfo(*this));
382
383 auto *RBI = new AArch64RegisterBankInfo(*getRegisterInfo());
384
385 // FIXME: At this point, we can't rely on Subtarget having RBI.
386 // It's awkward to mix passing RBI and the Subtarget; should we pass
387 // TII/TRI as well?
389 *static_cast<const AArch64TargetMachine *>(&TM), *this, *RBI));
390
391 RegBankInfo.reset(RBI);
392
393 auto TRI = getRegisterInfo();
395 for (unsigned i = 0; i < 29; ++i) {
396 if (ReservedRegNames.count(TRI->getName(AArch64::X0 + i)))
398 }
399 // X30 is named LR, so we can't use TRI->getName to check X30.
400 if (ReservedRegNames.count("X30") || ReservedRegNames.count("LR"))
401 ReserveXRegisterForRA.set(30);
402 // X29 is named FP, so we can't use TRI->getName to check X29.
403 if (ReservedRegNames.count("X29") || ReservedRegNames.count("FP"))
404 ReserveXRegisterForRA.set(29);
405
406 // To benefit from SME2's strided-register multi-vector load/store
407 // instructions we'll need to enable subreg liveness. Our longer
408 // term aim is to make this the default, regardless of streaming
409 // mode, but there are still some outstanding issues, see:
410 // https://github.com/llvm/llvm-project/pull/174188
411 // and:
412 // https://github.com/llvm/llvm-project/pull/168353
413 if (IsStreaming)
415 else
417}
418
422
426
430
432 return Legalizer.get();
433}
434
436 return RegBankInfo.get();
437}
438
439/// Find the target operand flags that describe how a global value should be
440/// referenced for the current subtarget.
441unsigned
443 const TargetMachine &TM) const {
444 // MachO large model always goes via a GOT, simply to get a single 8-byte
445 // absolute relocation on all global addresses.
447 return AArch64II::MO_GOT;
448
449 // All globals dynamically protected by MTE must have their address tags
450 // synthesized. This is done by having the loader stash the tag in the GOT
451 // entry. Force all tagged globals (even ones with internal linkage) through
452 // the GOT.
453 if (GV->isTagged())
454 return AArch64II::MO_GOT;
455
456 if (!TM.shouldAssumeDSOLocal(GV)) {
457 if (GV->hasDLLImportStorageClass()) {
459 }
460 if (getTargetTriple().isOSWindows())
462 return AArch64II::MO_GOT;
463 }
464
465 // The small code model's direct accesses use ADRP, which cannot
466 // necessarily produce the value 0 (if the code is above 4GB).
467 // Same for the tiny code model, where we have a pc relative LDR.
470 return AArch64II::MO_GOT;
471
472 // References to tagged globals are marked with MO_NC | MO_TAGGED to indicate
473 // that their nominal addresses are tagged and outside of the code model. In
474 // AArch64ExpandPseudo::expandMI we emit an additional instruction to set the
475 // tag if necessary based on MO_TAGGED.
476 if (AllowTaggedGlobals && !isa<FunctionType>(GV->getValueType()))
478
480}
481
483 const GlobalValue *GV, const TargetMachine &TM) const {
484 // MachO large model always goes via a GOT, because we don't have the
485 // relocations available to do anything else..
487 !GV->hasInternalLinkage())
488 return AArch64II::MO_GOT;
489
490 // NonLazyBind goes via GOT unless we know it's available locally.
491 auto *F = dyn_cast<Function>(GV);
492 if ((!isTargetMachO() || MachOUseNonLazyBind) && F &&
493 F->hasFnAttribute(Attribute::NonLazyBind) && !TM.shouldAssumeDSOLocal(GV))
494 return AArch64II::MO_GOT;
495
496 if (getTargetTriple().isOSWindows()) {
497 if (isWindowsArm64EC() && GV->getValueType()->isFunctionTy()) {
498 if (GV->hasDLLImportStorageClass()) {
499 // On Arm64EC, if we're calling a symbol from the import table
500 // directly, use MO_ARM64EC_CALLMANGLE.
503 }
504 if (GV->hasExternalLinkage()) {
505 // If we're calling a symbol directly, use the mangled form in the
506 // call instruction.
508 }
509 }
510
511 // Use ClassifyGlobalReference for setting MO_DLLIMPORT/MO_COFFSTUB.
512 return ClassifyGlobalReference(GV, TM);
513 }
514
516}
517
519 const SchedRegion &Region) const {
520 // LNT run (at least on Cyclone) showed reasonably significant gains for
521 // bi-directional scheduling. 253.perlbmk.
522 Policy.OnlyTopDown = false;
523 Policy.OnlyBottomUp = false;
524 // Enabling or Disabling the latency heuristic is a close call: It seems to
525 // help nearly no benchmark on out-of-order architectures, on the other hand
526 // it regresses register pressure on a few benchmarking.
527 Policy.DisableLatencyHeuristic = DisableLatencySchedHeuristic;
528}
529
531 SUnit *Def, int DefOpIdx, SUnit *Use, int UseOpIdx, SDep &Dep,
532 const TargetSchedModel *SchedModel) const {
533 if (!SchedModel || Dep.getKind() != SDep::Kind::Data || !Dep.getReg() ||
534 !Def->isInstr() || !Use->isInstr() ||
535 (Def->getInstr()->getOpcode() != TargetOpcode::BUNDLE &&
536 Use->getInstr()->getOpcode() != TargetOpcode::BUNDLE))
537 return;
538
539 // If the Def is a BUNDLE, find the last instruction in the bundle that defs
540 // the register.
541 const MachineInstr *DefMI = Def->getInstr();
542 if (DefMI->getOpcode() == TargetOpcode::BUNDLE) {
543 Register Reg = DefMI->getOperand(DefOpIdx).getReg();
544 for (const auto &Op : const_mi_bundle_ops(*DefMI)) {
545 if (Op.isReg() && Op.isDef() && Op.getReg() == Reg) {
546 DefMI = Op.getParent();
547 DefOpIdx = Op.getOperandNo();
548 }
549 }
550 }
551
552 // If the Use is a BUNDLE, find the first instruction that uses the Reg.
553 const MachineInstr *UseMI = Use->getInstr();
554 if (UseMI->getOpcode() == TargetOpcode::BUNDLE) {
555 Register Reg = UseMI->getOperand(UseOpIdx).getReg();
556 for (const auto &Op : const_mi_bundle_ops(*UseMI)) {
557 if (Op.isReg() && Op.isUse() && Op.getReg() == Reg) {
558 UseMI = Op.getParent();
559 UseOpIdx = Op.getOperandNo();
560 break;
561 }
562 }
563 }
564
565 Dep.setLatency(
566 SchedModel->computeOperandLatency(DefMI, DefOpIdx, UseMI, UseOpIdx));
567}
568
572
575 return false;
576
577 if (TargetTriple.isDriverKit())
578 return true;
579 if (TargetTriple.isiOS()) {
580 return TargetTriple.getiOSVersion() >= VersionTuple(8);
581 }
582
583 return false;
584}
585
586std::unique_ptr<PBQPRAConstraint>
588 return balanceFPOps() ? std::make_unique<A57ChainingConstraint>() : nullptr;
589}
590
592 // We usually compute max call frame size after ISel. Do the computation now
593 // if the .mir file didn't specify it. Note that this will probably give you
594 // bogus values after PEI has eliminated the callframe setup/destroy pseudo
595 // instructions, specify explicitly if you need it to be correct.
596 MachineFrameInfo &MFI = MF.getFrameInfo();
599}
600
601bool AArch64Subtarget::useAA() const { return UseAA; }
602
604 // If SVE2 or SME is present (we are not SVE-1 only) and UseScalarIncVL
605 // is not otherwise set, enable it by default.
606 if (UseScalarIncVL.getNumOccurrences())
607 return UseScalarIncVL;
608 return hasSVE2() || hasSME();
609}
610
611// If return address signing is enabled, tail calls are emitted as follows:
612//
613// ```
614// <authenticate LR>
615// <check LR>
616// TCRETURN ; the callee may sign and spill the LR in its prologue
617// ```
618//
619// LR may require explicit checking because if FEAT_FPAC is not implemented
620// and LR was tampered with, then `<authenticate LR>` will not generate an
621// exception on its own. Later, if the callee spills the signed LR value and
622// neither FEAT_PAuth2 nor FEAT_EPAC are implemented, the valid PAC replaces
623// the higher bits of LR thus hiding the authentication failure.
625 const MachineFunction &MF) const {
626 // TODO: Check subtarget for the scheme. Present variant is a default for
627 // pauthtest ABI.
628 if (MF.getFunction().hasFnAttribute("ptrauth-returns") &&
629 MF.getFunction().hasFnAttribute("ptrauth-auth-traps"))
631 if (AuthenticatedLRCheckMethod.getNumOccurrences())
633
634 // At now, use None by default because checks may introduce an unexpected
635 // performance regression or incompatibility with execute-only mappings.
637}
638
639std::optional<uint16_t>
641 const Function &ParentFn) const {
642 if (!ParentFn.hasFnAttribute("ptrauth-indirect-gotos"))
643 return std::nullopt;
644 // We currently have one simple mechanism for all targets.
645 // This isn't ABI, so we can always do better in the future.
647 (Twine(ParentFn.getName()) + " blockaddress").str());
648}
649
651 // The Darwin kernel implements special protections for x16 and x17 so we
652 // should prefer to use those registers on that platform.
653 return isTargetDarwin();
654}
655
657 return getSchedModel().hasInstrSchedModel();
658}
This file describes how to lower LLVM calls to machine code calls.
MachineInstrBuilder & UseMI
MachineInstrBuilder MachineInstrBuilder & DefMI
This file declares the targeting of the Machinelegalizer class for AArch64.
@ Generic
#define AUTH_CHECK_METHOD_CL_VALUES_LR
This file declares the targeting of the RegisterBankInfo class for AArch64.
static cl::opt< bool > UseAddressTopByteIgnored("aarch64-use-tbi", cl::desc("Assume that top byte of " "an address is ignored"), cl::init(false), cl::Hidden)
static cl::opt< unsigned > AArch64MinimumJumpTableEntries("aarch64-min-jump-table-entries", cl::init(10), cl::Hidden, cl::desc("Set minimum number of entries to use a jump table on AArch64"))
static cl::opt< bool > MachOUseNonLazyBind("aarch64-macho-enable-nonlazybind", cl::desc("Call nonlazybind functions via direct GOT load for Mach-O"), cl::Hidden)
static cl::opt< AArch64PAuth::AuthCheckMethod > AuthenticatedLRCheckMethod("aarch64-authenticated-lr-check-method", cl::Hidden, cl::desc("Override the variant of check applied " "to authenticated LR during tail call"), cl::values(AUTH_CHECK_METHOD_CL_VALUES_LR))
static cl::opt< bool > EnableSubregLivenessTracking("aarch64-enable-subreg-liveness-tracking", cl::init(false), cl::Hidden, cl::desc("Enable subreg liveness tracking"))
static cl::opt< bool > EnableEarlyIfConvert("aarch64-early-ifcvt", cl::desc("Enable the early if " "converter pass"), cl::init(true), cl::Hidden)
static cl::opt< unsigned > AArch64StreamingHazardSize("aarch64-streaming-hazard-size", cl::desc("Hazard size for streaming mode memory accesses. 0 = disabled."), cl::init(0), cl::Hidden)
static cl::opt< bool > UseAA("aarch64-use-aa", cl::init(true), cl::desc("Enable the use of AA during codegen."))
static cl::alias AArch64StreamingStackHazardSize("aarch64-stack-hazard-size", cl::desc("alias for -aarch64-streaming-hazard-size"), cl::aliasopt(AArch64StreamingHazardSize))
static cl::opt< bool > UseScalarIncVL("sve-use-scalar-inc-vl", cl::init(false), cl::Hidden, cl::desc("Prefer add+cnt over addvl/inc/dec"))
static cl::opt< unsigned > VScaleForTuningOpt("sve-vscale-for-tuning", cl::Hidden, cl::desc("Force a vscale for tuning factor for SVE"))
static cl::list< std::string > ReservedRegsForRA("reserve-regs-for-regalloc", cl::desc("Reserve physical " "registers, so they can't be used by register allocator. " "Should only be used for testing register allocator."), cl::CommaSeparated, cl::Hidden)
static cl::opt< unsigned > OverrideVectorInsertExtractBaseCost("aarch64-insert-extract-base-cost", cl::desc("Base cost of vector insert/extract element"), cl::Hidden)
static cl::opt< unsigned > MinPrefetchStride("min-prefetch-stride", cl::desc("Min stride to add prefetches"), cl::Hidden)
static cl::opt< unsigned > PrefetchDistance("prefetch-distance", cl::desc("Number of instructions to prefetch ahead"), cl::Hidden)
static cl::opt< unsigned > MaxPrefetchIterationsAhead("max-prefetch-iters-ahead", cl::desc("Max number of iterations to prefetch ahead"), cl::Hidden)
static cl::opt< unsigned > EpilogueVectorizationMinVF("epilogue-vectorization-minimum-VF", cl::Hidden, cl::desc("Only loops with vectorization factor equal to or larger than " "the specified value are considered for epilogue vectorization."))
#define F(x, y, z)
Definition MD5.cpp:54
Register const TargetRegisterInfo * TRI
static cl::opt< unsigned > CacheLineSize("cache-line-size", cl::init(0), cl::Hidden, cl::desc("Use this to override the target cache line size when " "specified by the user."))
This class provides the information for the target register banks.
const CallLowering * getCallLowering() const override
const AArch64RegisterInfo * getRegisterInfo() const override
TailFoldingOpts DefaultSVETFOpts
std::unique_ptr< InstructionSelector > InstSelector
ARMProcFamilyEnum ARMProcFamily
ARMProcFamily - ARM processor family: Cortex-A53, Cortex-A57, and others.
std::unique_ptr< RegisterBankInfo > RegBankInfo
std::optional< unsigned > StreamingHazardSize
bool enableEarlyIfConversion() const override
const InlineAsmLowering * getInlineAsmLowering() const override
unsigned getVectorInsertExtractBaseCost() const
bool enableMachinePipeliner() const override
std::unique_ptr< CallLowering > CallLoweringInfo
GlobalISel related APIs.
std::optional< uint16_t > getPtrAuthBlockAddressDiscriminatorIfEnabled(const Function &ParentFn) const
Compute the integer discriminator for a given BlockAddress constant, if blockaddress signing is enabl...
unsigned classifyGlobalFunctionReference(const GlobalValue *GV, const TargetMachine &TM) const
bool useAA() const override
const AArch64TargetLowering * getTargetLowering() const override
bool supportsAddressTopByteIgnored() const
CPU has TBI (top byte of addresses is ignored during HW address translation) and OS enables it.
void overrideSchedPolicy(MachineSchedPolicy &Policy, const SchedRegion &Region) const override
const Triple & getTargetTriple() const
void adjustSchedDependency(SUnit *Def, int DefOpIdx, SUnit *Use, int UseOpIdx, SDep &Dep, const TargetSchedModel *SchedModel) const override
void mirFileLoaded(MachineFunction &MF) const override
Triple TargetTriple
TargetTriple - What processor and OS we're targeting.
InstructionSelector * getInstructionSelector() const override
unsigned ClassifyGlobalReference(const GlobalValue *GV, const TargetMachine &TM) const
ClassifyGlobalReference - Find the target operand flags that describe how a global value should be re...
void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS)
ParseSubtargetFeatures - Parses features string setting specified subtarget options.
bool isX16X17Safer() const
Returns whether the operating system makes it safer to store sensitive values in x16 and x17 as oppos...
bool useScalarIncVL() const
Returns true to use the addvl/inc/dec instructions, as opposed to separate add + cnt instructions.
const LegalizerInfo * getLegalizerInfo() const override
AArch64Subtarget(const Triple &TT, StringRef CPU, StringRef TuneCPU, StringRef FS, const TargetMachine &TM, bool LittleEndian, unsigned MinSVEVectorSizeInBitsOverride=0, unsigned MaxSVEVectorSizeInBitsOverride=0, bool IsStreaming=false, bool IsStreamingCompatible=false, bool HasMinSize=false, bool EnableSRLTSubregToRegMitigation=false)
This constructor initializes the data members to match that of the specified triple.
std::unique_ptr< PBQPRAConstraint > getCustomPBQPConstraints() const override
AArch64PAuth::AuthCheckMethod getAuthenticatedLRCheckMethod(const MachineFunction &MF) const
Choose a method of checking LR before performing a tail call.
AArch64InstrInfo InstrInfo
AArch64TargetLowering TLInfo
const RegisterBankInfo * getRegBankInfo() const override
std::unique_ptr< LegalizerInfo > Legalizer
std::unique_ptr< InlineAsmLowering > InlineAsmLoweringInfo
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition Function.cpp:730
bool hasExternalLinkage() const
bool isTagged() const
bool hasExternalWeakLinkage() const
bool hasDLLImportStorageClass() const
bool hasInternalLinkage() const
Type * getValueType() const
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
LLVM_ABI void computeMaxCallFrameSize(MachineFunction &MF, std::vector< MachineBasicBlock::iterator > *FrameSDOps=nullptr)
Computes the maximum size of a callframe.
bool isMaxCallFrameSizeComputed() const
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
Function & getFunction()
Return the LLVM function that this machine code represents.
Representation of each machine instruction.
Holds all the information related to register banks.
Wrapper class representing virtual and physical registers.
Definition Register.h:20
Scheduling dependency.
Definition ScheduleDAG.h:51
Kind getKind() const
Returns an enum value representing the kind of the dependence.
@ Data
Regular data dependence (aka true-dependence).
Definition ScheduleDAG.h:55
void setLatency(unsigned Lat)
Sets the latency for this edge.
Register getReg() const
Returns the register associated with this edge.
Scheduling unit. This is a node in the scheduling DAG.
size_type count(StringRef Key) const
count - Return 1 if the element is in the map, 0 otherwise.
Definition StringMap.h:285
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:143
StringSet - A wrapper for StringMap that provides set-like functionality.
Definition StringSet.h:25
Primary interface to the complete machine description for the target machine.
bool shouldAssumeDSOLocal(const GlobalValue *GV) const
CodeModel::Model getCodeModel() const
Returns the code model.
Provide an instruction scheduling machine model to CodeGen passes.
LLVM_ABI unsigned computeOperandLatency(const MachineInstr *DefMI, unsigned DefOperIdx, const MachineInstr *UseMI, unsigned UseOperIdx) const
Compute operand latency based on the available machine model.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:47
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
bool isFunctionTy() const
True if this is an instance of FunctionType.
Definition Type.h:258
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
Represents a version number in the form major[.minor[.subminor[.build]]].
@ MO_DLLIMPORT
MO_DLLIMPORT - On a symbol operand, this represents that the reference to the symbol is for an import...
@ MO_NC
MO_NC - Indicates whether the linker is expected to check the symbol reference for overflow.
@ MO_GOT
MO_GOT - This flag indicates that a symbol operand represents the address of the GOT entry for the sy...
@ MO_ARM64EC_CALLMANGLE
MO_ARM64EC_CALLMANGLE - Operand refers to the Arm64EC-mangled version of a symbol,...
@ MO_TAGGED
MO_TAGGED - With MO_PAGE, indicates that the page includes a memory tag in bits 56-63.
@ MO_COFFSTUB
MO_COFFSTUB - On a symbol operand "FOO", this indicates that the reference is actually to the "....
AuthCheckMethod
Variants of check performed on an authenticated pointer.
@ HighBitsNoTBI
Check by comparing bits 62 and 61 of the authenticated address.
@ None
Do not check the value at all.
LLVM_ABI bool isX18ReservedByDefault(const Triple &TT)
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
constexpr from_range_t from_range
InstructionSelector * createAArch64InstructionSelector(const AArch64TargetMachine &, const AArch64Subtarget &, const AArch64RegisterBankInfo &)
iterator_range< ConstMIBundleOperands > const_mi_bundle_ops(const MachineInstr &MI)
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ABI uint16_t getPointerAuthStableSipHash(StringRef S)
Compute a stable non-zero 16-bit hash of the given string.
Definition SipHash.cpp:49
DWARFExpression::Operation Op
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:870
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Define a generic scheduling policy for targets that don't provide their own MachineSchedStrategy.
A region of an MBB for scheduling.