LLVM 24.0.0git
AArch64Subtarget.h
Go to the documentation of this file.
1//===--- AArch64Subtarget.h - Define Subtarget for the AArch64 -*- 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 declares the AArch64 specific subclass of TargetSubtarget.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_LIB_TARGET_AARCH64_AARCH64SUBTARGET_H
14#define LLVM_LIB_TARGET_AARCH64_AARCH64SUBTARGET_H
15
17#include "AArch64ISelLowering.h"
18#include "AArch64InstrInfo.h"
19#include "AArch64PointerAuth.h"
20#include "AArch64RegisterInfo.h"
28#include "llvm/IR/DataLayout.h"
30#include <optional>
31
32namespace llvm::AArch64 {
33// Mode for selecting how to insert frame record info into the stack ring
34// buffer.
36 // Do not record frame record info.
38
39 // Insert instructions into the prologue for storing into the stack ring
40 // buffer directly.
42};
43
45} // namespace llvm::AArch64
46
47#define OPTIONS_STRUCT_DECL
48#include "AArch64Options.inc"
49
50#define GET_SUBTARGETINFO_HEADER
51#include "AArch64GenSubtargetInfo.inc"
52
53namespace llvm {
54class GlobalValue;
55class StringRef;
56
58 const AArch64Options &CLOpts;
59
60public:
63#define ARM_PROCESSOR_FAMILY(ENUM) ENUM,
64#include "llvm/TargetParser/AArch64TargetParserDef.inc"
65#undef ARM_PROCESSOR_FAMILY
66 };
67
68protected:
69 /// ARMProcFamily - ARM processor family: Cortex-A53, Cortex-A57, and others.
71
72 // Enable 64-bit vectorization in SLP.
74
75// Bool members corresponding to the SubtargetFeatures defined in tablegen
76#define GET_SUBTARGETINFO_MACRO(ATTRIBUTE, DEFAULT, GETTER) \
77 bool ATTRIBUTE = DEFAULT;
78#include "AArch64GenSubtargetInfo.inc"
79
84 // Default scatter/gather overhead.
85 unsigned ScatterOverhead = 10;
86 unsigned GatherOverhead = 10;
89 unsigned MaxPrefetchIterationsAhead = UINT_MAX;
94 unsigned MaxJumpTableSize = 0;
95 unsigned FixedLoadLatency = 0;
96
97 // ReserveXRegister[i] - X#i is not available as a general purpose register.
99
100 // ReserveXRegisterForRA[i] - X#i is not available for register allocator.
102
103 // CustomCallUsedXRegister[i] - X#i call saved.
105
107
113 unsigned VScaleForTuning = 1;
115
117
118 /// TargetTriple - What processor and OS we're targeting.
120
125
126 /// GlobalISel related APIs.
127 std::unique_ptr<CallLowering> CallLoweringInfo;
128 std::unique_ptr<InlineAsmLowering> InlineAsmLoweringInfo;
129 std::unique_ptr<InstructionSelector> InstSelector;
130 std::unique_ptr<LegalizerInfo> Legalizer;
131 std::unique_ptr<RegisterBankInfo> RegBankInfo;
132
133private:
134 /// initializeSubtargetDependencies - Initializes using CPUString and the
135 /// passed in feature string so that we can use initializer lists for
136 /// subtarget initialization.
137 AArch64Subtarget &initializeSubtargetDependencies(StringRef FS,
138 StringRef CPUString,
139 StringRef TuneCPUString,
140 bool HasMinSize);
141
142 /// Initialize properties based on the selected processor family.
143 void initializeProperties(bool HasMinSize);
144
145public:
146 /// This constructor initializes the data members to match that
147 /// of the specified triple.
148 AArch64Subtarget(const Triple &TT, StringRef CPU, StringRef TuneCPU,
149 StringRef FS, const TargetMachine &TM, bool LittleEndian,
150 unsigned MinSVEVectorSizeInBitsOverride = 0,
151 unsigned MaxSVEVectorSizeInBitsOverride = 0,
152 bool IsStreaming = false, bool IsStreamingCompatible = false,
153 bool HasMinSize = false,
155
156 const AArch64Options &getCLOpts() const { return CLOpts; }
157
158// Getters for SubtargetFeatures defined in tablegen
159#define GET_SUBTARGETINFO_MACRO(ATTRIBUTE, DEFAULT, GETTER) \
160 bool GETTER() const { return ATTRIBUTE; }
161#include "AArch64GenSubtargetInfo.inc"
162
164 return &TSInfo;
165 }
166 const AArch64FrameLowering *getFrameLowering() const override {
167 return &FrameLowering;
168 }
169 const AArch64TargetLowering *getTargetLowering() const override {
170 return &TLInfo;
171 }
172 const AArch64InstrInfo *getInstrInfo() const override { return &InstrInfo; }
173 const AArch64RegisterInfo *getRegisterInfo() const override {
174 return &getInstrInfo()->getRegisterInfo();
175 }
176 const CallLowering *getCallLowering() const override;
177 const InlineAsmLowering *getInlineAsmLowering() const override;
179 const LegalizerInfo *getLegalizerInfo() const override;
180 const RegisterBankInfo *getRegBankInfo() const override;
181 const Triple &getTargetTriple() const { return TargetTriple; }
182 bool enableMachineScheduler() const override { return true; }
183 bool enablePostRAScheduler() const override { return usePostRAScheduler(); }
184 bool enableSubRegLiveness() const override { return EnableSubregLiveness; }
185
186 bool enableMachinePipeliner() const override;
187 bool useDFAforSMS() const override { return false; }
188
189 /// Returns ARM processor family.
190 /// Avoid this function! CPU specifics should be kept local to this class
191 /// and preferably modeled with SubtargetFeatures or properties in
192 /// initializeProperties().
194 return ARMProcFamily;
195 }
196
197 /// Returns true if the processor is an Apple M-series or aligned A-series
198 /// (A14 or newer).
199 bool isAppleMLike() const {
200 switch (ARMProcFamily) {
201 case AppleA14:
202 case AppleA15:
203 case AppleA16:
204 case AppleA17:
205 case AppleM4:
206 case AppleM5:
207 case AppleM6:
208 return true;
209 default:
210 return false;
211 }
212 }
213
214 bool isXRaySupported() const override { return true; }
215
216 /// Returns true if the function has a streaming body.
217 bool isStreaming() const { return IsStreaming; }
218
219 /// Returns true if the function has a streaming-compatible body.
221
222 /// Returns the size of memory region that if accessed by both the CPU and
223 /// the SME unit could result in a hazard. 0 = disabled.
224 unsigned getStreamingHazardSize() const {
225 return CLOpts.streaming_hazard_size.value_or(
226 !hasSMEFA64() && hasSME() && hasSVE() ? 1024 : 0);
227 }
228
229 /// Returns true if the target has NEON and the function at runtime is known
230 /// to have NEON enabled (e.g. the function is known not to be in streaming-SVE
231 /// mode, which disables NEON instructions).
232 bool isNeonAvailable() const {
233 return hasNEON() &&
234 (hasSMEFA64() || (!isStreaming() && !isStreamingCompatible()));
235 }
236
237 /// Returns true if the target has SVE and can use the full range of SVE
238 /// instructions, for example because it knows the function is known not to be
239 /// in streaming-SVE mode or when the target has FEAT_FA64 enabled.
240 bool isSVEAvailable() const {
241 return hasSVE() &&
242 (hasSMEFA64() || (!isStreaming() && !isStreamingCompatible()));
243 }
244
245 /// Returns true if the target has access to the streaming-compatible subset
246 /// of SVE instructions.
247 bool isStreamingSVEAvailable() const { return hasSME() && isStreaming(); }
248
249 /// Returns true if the target has access to either the full range of SVE
250 /// instructions, or the streaming-compatible subset of SVE instructions.
252 return hasSVE() || isStreamingSVEAvailable();
253 }
254
255 /// Returns true if the target has access to either the full range of SVE
256 /// instructions, or the streaming-compatible subset of SVE instructions
257 /// available to SME2.
259 return isSVEAvailable() || (isSVEorStreamingSVEAvailable() && hasSME2());
260 }
261
262 /// Returns true if SVE bit-permute instructions (bext/bdep/bgrp) can be
263 /// emitted.
265 return hasSVEBitPerm() &&
266 (isSVEAvailable() ||
267 (isSVEorStreamingSVEAvailable() && hasSSVE_BitPerm()));
268 }
269
271 // Don't assume any minimum vector size when PSTATE.SM may not be 0, because
272 // we don't yet support streaming-compatible codegen support that we trust
273 // is safe for functions that may be executed in streaming-SVE mode.
274 // By returning '0' here, we disable vectorization.
275 if (!isSVEAvailable() && !isNeonAvailable())
276 return 0;
278 }
279
280 bool isXRegisterReserved(size_t i) const { return ReserveXRegister[i]; }
281 bool isXRegisterReservedForRA(size_t i) const { return ReserveXRegisterForRA[i]; }
282 unsigned getNumXRegisterReserved() const {
283 BitVector AllReservedX(AArch64::GPR64commonRegClass.getNumRegs());
284 AllReservedX |= ReserveXRegister;
285 AllReservedX |= ReserveXRegisterForRA;
286 return AllReservedX.count();
287 }
288 bool isLRReservedForRA() const { return ReserveLRForRA; }
289 bool isXRegCustomCalleeSaved(size_t i) const {
290 return CustomCallSavedXRegs[i];
291 }
292 bool hasCustomCallingConv() const { return CustomCallSavedXRegs.any(); }
293
294 /// Return true if the CPU supports any kind of instruction fusion.
295 bool hasFusion() const {
296 return hasArithmeticBccFusion() || hasArithmeticCbzFusion() ||
297 hasFuseAES() || hasFuseArithmeticLogic() || hasFuseCmpCSel() ||
298 hasFuseFCmpFCSel() || hasFuseCmpCSet() || hasFuseAdrpAdd() ||
299 hasFuseLiterals() || hasFuseAppleSMECompute() || hasFuseFMinFMax();
300 }
301
302 /// Return true if the subtarget fuses this pair of move immediate
303 /// instructions.
304 bool fusesMOVImmPair(unsigned FirstOpc, unsigned FirstShift,
305 unsigned SecondOpc, unsigned SecondShift) const;
306
307 /// Return true if the subtarget fuses this pair of move immediate
308 /// instructions. The 1st instruction is a wildcard when it is nullptr, which
309 /// tells whether the 2nd one can be fused at all.
310 bool fusesMOVImmPair(const MachineInstr *FirstMI,
311 const MachineInstr &SecondMI) const;
312
315 }
316 unsigned getMaxInterleaveFactor() const { return MaxInterleaveFactor; }
317 unsigned getVectorInsertExtractBaseCost() const;
318 unsigned getCacheLineSize() const override { return CacheLineSize; }
319 unsigned getScatterOverhead() const { return ScatterOverhead; }
320 unsigned getGatherOverhead() const { return GatherOverhead; }
321 unsigned getPrefetchDistance() const override { return PrefetchDistance; }
322 unsigned getMinPrefetchStride(unsigned NumMemAccesses,
323 unsigned NumStridedMemAccesses,
324 unsigned NumPrefetches,
325 bool HasCall) const override {
326 return MinPrefetchStride;
327 }
328 unsigned getMaxPrefetchIterationsAhead() const override {
330 }
335
338 }
339
340 unsigned getMaximumJumpTableSize() const { return MaxJumpTableSize; }
341 unsigned getMinimumJumpTableEntries() const {
343 }
344
345 unsigned getFixedLoadLatency() const { return FixedLoadLatency; }
346
347 /// CPU has TBI (top byte of addresses is ignored during HW address
348 /// translation) and OS enables it.
350
351 bool isLittleEndian() const { return IsLittle; }
352
353 bool isTargetDarwin() const { return TargetTriple.isOSDarwin(); }
354 bool isTargetIOS() const { return TargetTriple.isiOS(); }
355 bool isTargetLinux() const { return TargetTriple.isOSLinux(); }
356 bool isTargetWindows() const { return TargetTriple.isOSWindows(); }
357 bool isTargetUEFI() const { return TargetTriple.isUEFI(); }
358 /// UEFI follows the Windows ARM64 ABI and produces PE/COFF images, so most
359 /// of the Windows specific ABI handling (calling convention, callee saved
360 /// registers, frame chain, stack probing and unwind info) applies to it.
362 return TargetTriple.isOSWindowsOrUEFI();
363 }
364 bool isTargetAndroid() const { return TargetTriple.isAndroid(); }
365 bool isTargetFuchsia() const { return TargetTriple.isOSFuchsia(); }
366 bool isWindowsArm64EC() const { return TargetTriple.isWindowsArm64EC(); }
367 bool isLFI() const { return TargetTriple.isLFI(); }
368
369 bool isTargetCOFF() const { return TargetTriple.isOSBinFormatCOFF(); }
370 bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); }
371 bool isTargetMachO() const { return TargetTriple.isOSBinFormatMachO(); }
372
373 bool isTargetILP32() const {
374 return TargetTriple.isArch32Bit() ||
375 TargetTriple.getEnvironment() == Triple::GNUILP32;
376 }
377
378 bool useAA() const override;
379
380 bool addrSinkUsingGEPs() const override {
381 // Keeping GEPs inbounds is important for exploiting AArch64
382 // addressing-modes in ILP32 mode.
383 return useAA() || isTargetILP32();
384 }
385
386 bool useSmallAddressing() const {
387 switch (TLInfo.getTargetMachine().getCodeModel()) {
389 // Kernel is currently allowed only for Fuchsia targets,
390 // where it is the same as Small for almost all purposes.
391 case CodeModel::Small:
392 return true;
393 default:
394 return false;
395 }
396 }
397
398 /// Returns whether the operating system makes it safer to store sensitive
399 /// values in x16 and x17 as opposed to other registers.
400 bool isX16X17Safer() const;
401
402 /// ParseSubtargetFeatures - Parses features string setting specified
403 /// subtarget options. Definition of function is auto generated by tblgen.
405
406 /// ClassifyGlobalReference - Find the target operand flags that describe
407 /// how a global value should be referenced for the current subtarget.
408 unsigned ClassifyGlobalReference(const GlobalValue *GV,
409 const TargetMachine &TM) const;
410
412 const TargetMachine &TM) const;
413
414 /// This function is design to compatible with the function def in other
415 /// targets and escape build error about the virtual function def in base
416 /// class TargetSubtargetInfo. Updeate me if AArch64 target need to use it.
417 unsigned char
419 return 0;
420 }
421
423 const SchedRegion &Region) const override;
424
425 void adjustSchedDependency(SUnit *Def, int DefOpIdx, SUnit *Use, int UseOpIdx,
426 SDep &Dep,
427 const TargetSchedModel *SchedModel) const override;
428
429 bool enableEarlyIfConversion() const override;
430
431 std::unique_ptr<PBQPRAConstraint> getCustomPBQPConstraints() const override;
432
433 bool isCallingConvWin64(CallingConv::ID CC, bool IsVarArg) const {
434 switch (CC) {
435 case CallingConv::C:
439 return isTargetWindowsOrUEFI();
441 return IsVarArg && isTargetWindowsOrUEFI();
443 return true;
444 default:
445 return false;
446 }
447 }
448
449 /// Return whether FrameLowering should always set the "extended frame
450 /// present" bit in FP, or set it based on a symbol in the runtime.
452 // Older OS versions (particularly system unwinders) are confused by the
453 // Swift extended frame, so when building code that might be run on them we
454 // must dynamically query the concurrency library to determine whether
455 // extended frames should be flagged as present.
456 const Triple &TT = getTargetTriple();
457
458 unsigned Major = TT.getOSVersion().getMajor();
459 switch(TT.getOS()) {
460 default:
461 return false;
462 case Triple::IOS:
463 case Triple::TvOS:
464 return Major < 15;
465 case Triple::WatchOS:
466 return Major < 8;
467 case Triple::MacOSX:
468 case Triple::Darwin:
469 return Major < 12;
470 }
471 }
472
473 void mirFileLoaded(MachineFunction &MF) const override;
474
475 // Return the known range for the bit length of SVE data registers. A value
476 // of 0 means nothing is known about that particular limit beyond what's
477 // implied by the architecture.
478 unsigned getMaxSVEVectorSizeInBits() const {
480 "Tried to get SVE vector length without SVE support!");
482 }
483
484 unsigned getMinSVEVectorSizeInBits() const {
486 "Tried to get SVE vector length without SVE support!");
488 }
489
490 // Return the known bit length of SVE data registers. A value of 0 means the
491 // length is unknown beyond what's implied by the architecture.
492 unsigned getSVEVectorSizeInBits() const {
494 "Tried to get SVE vector length without SVE support!");
497 return 0;
498 }
499
500 // Return the known bit length of SVE predicate registers. A value of 0 means
501 // the length is unknown beyond what's implied by the architecture.
502 unsigned getSVEPredicateSizeInBits() const {
503 return getSVEVectorSizeInBits() / 8;
504 }
505
508 return false;
509
510 // Prefer NEON unless larger SVE registers are available.
511 return !isNeonAvailable() || getMinSVEVectorSizeInBits() >= 256;
512 }
513
516 return false;
519 }
520
521 unsigned getVScaleForTuning() const { return VScaleForTuning; }
522
526
527 /// Returns true to use the addvl/inc/dec instructions, as opposed to separate
528 /// add + cnt instructions.
529 bool useScalarIncVL() const;
530
534
535 /// Choose a method of checking LR before performing a tail call.
538
539 /// Compute the integer discriminator for a given BlockAddress constant, if
540 /// blockaddress signing is enabled, or std::nullopt otherwise.
541 /// Blockaddress signing is controlled by the function attribute
542 /// "ptrauth-indirect-gotos" on the parent function.
543 /// Note that this assumes the discriminator is independent of the indirect
544 /// goto branch site itself, i.e., it's the same for all BlockAddresses in
545 /// a function.
546 std::optional<uint16_t>
548
549 bool enableAggressiveInterleaving() const { return AggressiveInterleaving; }
550};
551} // End llvm namespace
552
553#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file describes how to lower LLVM calls to machine code calls.
This file describes how to lower LLVM inline asm to machine code INLINEASM.
Interface for Targets to specify which operations they can successfully select and how the others sho...
RISCVCC::CondCode CC
const AArch64RegisterInfo & getRegisterInfo() const
getRegisterInfo - TargetInstrInfo is a superset of MRegister info.
const AArch64SelectionDAGInfo * getSelectionDAGInfo() const override
const CallLowering * getCallLowering() const override
const AArch64RegisterInfo * getRegisterInfo() const override
bool enableSRLTSubregToRegMitigation() const
bool isNeonAvailable() const
Returns true if the target has NEON and the function at runtime is known to have NEON enabled (e....
TailFoldingOpts DefaultSVETFOpts
unsigned getMinPrefetchStride(unsigned NumMemAccesses, unsigned NumStridedMemAccesses, unsigned NumPrefetches, bool HasCall) const override
bool addrSinkUsingGEPs() const override
std::unique_ptr< InstructionSelector > InstSelector
bool enableAggressiveInterleaving() const
ARMProcFamilyEnum ARMProcFamily
ARMProcFamily - ARM processor family: Cortex-A53, Cortex-A57, and others.
unsigned getMinimumJumpTableEntries() const
std::unique_ptr< RegisterBankInfo > RegBankInfo
bool useSVEForFixedLengthVectors(EVT VT) const
const AArch64InstrInfo * getInstrInfo() const override
bool hasFusion() const
Return true if the CPU supports any kind of instruction fusion.
AArch64SelectionDAGInfo TSInfo
unsigned getMaximumJumpTableSize() const
AArch64FrameLowering FrameLowering
bool enableEarlyIfConversion() const override
const InlineAsmLowering * getInlineAsmLowering() const override
const AArch64Options & getCLOpts() const
unsigned getCacheLineSize() const override
unsigned getFixedLoadLatency() const
unsigned getVectorInsertExtractBaseCost() const
bool enableMachinePipeliner() const override
ARMProcFamilyEnum getProcFamily() const
Returns ARM processor family.
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 getGatherOverhead() const
bool isXRegisterReservedForRA(size_t i) const
unsigned getNumXRegisterReserved() const
unsigned classifyGlobalFunctionReference(const GlobalValue *GV, const TargetMachine &TM) const
bool useAA() const override
bool fusesMOVImmPair(unsigned FirstOpc, unsigned FirstShift, unsigned SecondOpc, unsigned SecondShift) const
Return true if the subtarget fuses this pair of move immediate instructions.
bool isStreamingSVEAvailable() const
Returns true if the target has access to the streaming-compatible subset of SVE instructions.
const AArch64TargetLowering * getTargetLowering() const override
Align getPrefLoopAlignment() const
Align getPrefFunctionAlignment() const
unsigned getMaxBytesForLoopAlignment() const
bool isNonStreamingSVEorSME2Available() const
Returns true if the target has access to either the full range of SVE instructions,...
bool supportsAddressTopByteIgnored() const
CPU has TBI (top byte of addresses is ignored during HW address translation) and OS enables it.
unsigned getMaxInterleaveFactor() const
void overrideSchedPolicy(MachineSchedPolicy &Policy, const SchedRegion &Region) const override
unsigned char classifyGlobalFunctionReference(const GlobalValue *GV) const override
This function is design to compatible with the function def in other targets and escape build error a...
const Triple & getTargetTriple() const
unsigned getStreamingHazardSize() const
Returns the size of memory region that if accessed by both the CPU and the SME unit could result in a...
bool isStreamingCompatible() const
Returns true if the function has a streaming-compatible body.
bool isSVEBitPermAvailable() const
Returns true if SVE bit-permute instructions (bext/bdep/bgrp) can be emitted.
bool isXRegCustomCalleeSaved(size_t i) 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
bool isSVEorStreamingSVEAvailable() const
Returns true if the target has access to either the full range of SVE instructions,...
bool enableSubRegLiveness() const override
TailFoldingOpts getSVETailFoldingDefaultOpts() const
bool useSVEForFixedLengthVectors() const
unsigned ClassifyGlobalReference(const GlobalValue *GV, const TargetMachine &TM) const
ClassifyGlobalReference - Find the target operand flags that describe how a global value should be re...
bool isTargetWindowsOrUEFI() const
UEFI follows the Windows ARM64 ABI and produces PE/COFF images, so most of the Windows specific ABI h...
void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS)
ParseSubtargetFeatures - Parses features string setting specified subtarget options.
unsigned getSVEPredicateSizeInBits() const
unsigned getMinVectorRegisterBitWidth() const
bool isStreaming() const
Returns true if the function has a streaming body.
bool isX16X17Safer() const
Returns whether the operating system makes it safer to store sensitive values in x16 and x17 as oppos...
unsigned getSVEVectorSizeInBits() const
bool isXRegisterReserved(size_t i) const
unsigned getMaxPrefetchIterationsAhead() const override
bool useScalarIncVL() const
Returns true to use the addvl/inc/dec instructions, as opposed to separate add + cnt instructions.
bool useDFAforSMS() const override
const LegalizerInfo * getLegalizerInfo() const override
bool enableMachineScheduler() const override
unsigned getScatterOverhead() const
bool enablePostRAScheduler() 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
unsigned getEpilogueVectorizationMinVF() const
unsigned getMaxSVEVectorSizeInBits() const
bool isCallingConvWin64(CallingConv::ID CC, bool IsVarArg) const
unsigned getVScaleForTuning() const
unsigned getMinSVEVectorSizeInBits() const
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 isAppleMLike() const
Returns true if the processor is an Apple M-series or aligned A-series (A14 or newer).
bool isXRaySupported() const override
bool isSVEAvailable() const
Returns true if the target has SVE and can use the full range of SVE instructions,...
bool hasCustomCallingConv() const
const AArch64FrameLowering * getFrameLowering() const override
bool swiftAsyncContextIsDynamicallySet() const
Return whether FrameLowering should always set the "extended framepresent" bit in FP,...
unsigned getPrefetchDistance() const override
size_type count() const
Returns the number of bits which are set.
Definition BitVector.h:182
Representation of each machine instruction.
Holds all the information related to register banks.
Scheduling dependency.
Definition ScheduleDAG.h:54
Scheduling unit. This is a node in the scheduling DAG.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Primary interface to the complete machine description for the target machine.
Provide an instruction scheduling machine model to CodeGen passes.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
AuthCheckMethod
Variants of check performed on an authenticated pointer.
static constexpr unsigned SVEBitsPerBlock
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ Swift
Calling convention for Swift.
Definition CallingConv.h:69
@ Fast
Attempts to make calls as fast as possible (e.g.
Definition CallingConv.h:41
@ PreserveNone
Used for runtime calls that preserves none general registers.
Definition CallingConv.h:90
@ Win64
The C convention as implemented on Windows/x86-64 and AArch64.
@ SwiftTail
This follows the Swift calling convention in how arguments are passed but guarantees tail calls will ...
Definition CallingConv.h:87
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
TailFoldingOpts
An enum to describe what types of loops we should attempt to tail-fold: Disabled: None Reductions: Lo...
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Extended Value Type.
Definition ValueTypes.h:35
uint64_t getFixedSizeInBits() const
Return the size of the specified fixed width value type in bits.
Definition ValueTypes.h:419
bool isFixedLengthVector() const
Definition ValueTypes.h:214
Define a generic scheduling policy for targets that don't provide their own MachineSchedStrategy.
A region of an MBB for scheduling.