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
31#define GET_SUBTARGETINFO_HEADER
32#include "AArch64GenSubtargetInfo.inc"
33
34namespace llvm {
35class GlobalValue;
36class StringRef;
37
39public:
42#define ARM_PROCESSOR_FAMILY(ENUM) ENUM,
43#include "llvm/TargetParser/AArch64TargetParserDef.inc"
44#undef ARM_PROCESSOR_FAMILY
45 };
46
47protected:
48 /// ARMProcFamily - ARM processor family: Cortex-A53, Cortex-A57, and others.
50
51 // Enable 64-bit vectorization in SLP.
53
54// Bool members corresponding to the SubtargetFeatures defined in tablegen
55#define GET_SUBTARGETINFO_MACRO(ATTRIBUTE, DEFAULT, GETTER) \
56 bool ATTRIBUTE = DEFAULT;
57#include "AArch64GenSubtargetInfo.inc"
58
63 // Default scatter/gather overhead.
64 unsigned ScatterOverhead = 10;
65 unsigned GatherOverhead = 10;
68 unsigned MaxPrefetchIterationsAhead = UINT_MAX;
73 unsigned MaxJumpTableSize = 0;
74 unsigned FixedLoadLatency = 0;
75
76 // ReserveXRegister[i] - X#i is not available as a general purpose register.
78
79 // ReserveXRegisterForRA[i] - X#i is not available for register allocator.
81
82 // CustomCallUsedXRegister[i] - X#i call saved.
84
86
89 std::optional<unsigned> StreamingHazardSize;
93 unsigned VScaleForTuning = 1;
95
97
98 /// TargetTriple - What processor and OS we're targeting.
100
105
106 /// GlobalISel related APIs.
107 std::unique_ptr<CallLowering> CallLoweringInfo;
108 std::unique_ptr<InlineAsmLowering> InlineAsmLoweringInfo;
109 std::unique_ptr<InstructionSelector> InstSelector;
110 std::unique_ptr<LegalizerInfo> Legalizer;
111 std::unique_ptr<RegisterBankInfo> RegBankInfo;
112
113private:
114 /// initializeSubtargetDependencies - Initializes using CPUString and the
115 /// passed in feature string so that we can use initializer lists for
116 /// subtarget initialization.
117 AArch64Subtarget &initializeSubtargetDependencies(StringRef FS,
118 StringRef CPUString,
119 StringRef TuneCPUString,
120 bool HasMinSize);
121
122 /// Initialize properties based on the selected processor family.
123 void initializeProperties(bool HasMinSize);
124
125public:
126 /// This constructor initializes the data members to match that
127 /// of the specified triple.
128 AArch64Subtarget(const Triple &TT, StringRef CPU, StringRef TuneCPU,
129 StringRef FS, const TargetMachine &TM, bool LittleEndian,
130 unsigned MinSVEVectorSizeInBitsOverride = 0,
131 unsigned MaxSVEVectorSizeInBitsOverride = 0,
132 bool IsStreaming = false, bool IsStreamingCompatible = false,
133 bool HasMinSize = false,
135
136// Getters for SubtargetFeatures defined in tablegen
137#define GET_SUBTARGETINFO_MACRO(ATTRIBUTE, DEFAULT, GETTER) \
138 bool GETTER() const { return ATTRIBUTE; }
139#include "AArch64GenSubtargetInfo.inc"
140
142 return &TSInfo;
143 }
144 const AArch64FrameLowering *getFrameLowering() const override {
145 return &FrameLowering;
146 }
147 const AArch64TargetLowering *getTargetLowering() const override {
148 return &TLInfo;
149 }
150 const AArch64InstrInfo *getInstrInfo() const override { return &InstrInfo; }
151 const AArch64RegisterInfo *getRegisterInfo() const override {
152 return &getInstrInfo()->getRegisterInfo();
153 }
154 const CallLowering *getCallLowering() const override;
155 const InlineAsmLowering *getInlineAsmLowering() const override;
157 const LegalizerInfo *getLegalizerInfo() const override;
158 const RegisterBankInfo *getRegBankInfo() const override;
159 const Triple &getTargetTriple() const { return TargetTriple; }
160 bool enableMachineScheduler() const override { return true; }
161 bool enablePostRAScheduler() const override { return usePostRAScheduler(); }
162 bool enableSubRegLiveness() const override { return EnableSubregLiveness; }
163
164 bool enableMachinePipeliner() const override;
165 bool useDFAforSMS() const override { return false; }
166
167 /// Returns ARM processor family.
168 /// Avoid this function! CPU specifics should be kept local to this class
169 /// and preferably modeled with SubtargetFeatures or properties in
170 /// initializeProperties().
172 return ARMProcFamily;
173 }
174
175 /// Returns true if the processor is an Apple M-series or aligned A-series
176 /// (A14 or newer).
177 bool isAppleMLike() const {
178 switch (ARMProcFamily) {
179 case AppleA14:
180 case AppleA15:
181 case AppleA16:
182 case AppleA17:
183 case AppleM4:
184 case AppleM5:
185 return true;
186 default:
187 return false;
188 }
189 }
190
191 bool isXRaySupported() const override { return true; }
192
193 /// Returns true if the function has a streaming body.
194 bool isStreaming() const { return IsStreaming; }
195
196 /// Returns true if the function has a streaming-compatible body.
198
199 /// Returns the size of memory region that if accessed by both the CPU and
200 /// the SME unit could result in a hazard. 0 = disabled.
201 unsigned getStreamingHazardSize() const {
202 return StreamingHazardSize.value_or(
203 !hasSMEFA64() && hasSME() && hasSVE() ? 1024 : 0);
204 }
205
206 /// Returns true if the target has NEON and the function at runtime is known
207 /// to have NEON enabled (e.g. the function is known not to be in streaming-SVE
208 /// mode, which disables NEON instructions).
209 bool isNeonAvailable() const {
210 return hasNEON() &&
211 (hasSMEFA64() || (!isStreaming() && !isStreamingCompatible()));
212 }
213
214 /// Returns true if the target has SVE and can use the full range of SVE
215 /// instructions, for example because it knows the function is known not to be
216 /// in streaming-SVE mode or when the target has FEAT_FA64 enabled.
217 bool isSVEAvailable() const {
218 return hasSVE() &&
219 (hasSMEFA64() || (!isStreaming() && !isStreamingCompatible()));
220 }
221
222 /// Returns true if the target has access to the streaming-compatible subset
223 /// of SVE instructions.
224 bool isStreamingSVEAvailable() const { return hasSME() && isStreaming(); }
225
226 /// Returns true if the target has access to either the full range of SVE
227 /// instructions, or the streaming-compatible subset of SVE instructions.
229 return hasSVE() || isStreamingSVEAvailable();
230 }
231
232 /// Returns true if the target has access to either the full range of SVE
233 /// instructions, or the streaming-compatible subset of SVE instructions
234 /// available to SME2.
236 return isSVEAvailable() || (isSVEorStreamingSVEAvailable() && hasSME2());
237 }
238
240 // Don't assume any minimum vector size when PSTATE.SM may not be 0, because
241 // we don't yet support streaming-compatible codegen support that we trust
242 // is safe for functions that may be executed in streaming-SVE mode.
243 // By returning '0' here, we disable vectorization.
244 if (!isSVEAvailable() && !isNeonAvailable())
245 return 0;
247 }
248
249 bool isXRegisterReserved(size_t i) const { return ReserveXRegister[i]; }
250 bool isXRegisterReservedForRA(size_t i) const { return ReserveXRegisterForRA[i]; }
251 unsigned getNumXRegisterReserved() const {
252 BitVector AllReservedX(AArch64::GPR64commonRegClass.getNumRegs());
253 AllReservedX |= ReserveXRegister;
254 AllReservedX |= ReserveXRegisterForRA;
255 return AllReservedX.count();
256 }
257 bool isLRReservedForRA() const { return ReserveLRForRA; }
258 bool isXRegCustomCalleeSaved(size_t i) const {
259 return CustomCallSavedXRegs[i];
260 }
261 bool hasCustomCallingConv() const { return CustomCallSavedXRegs.any(); }
262
263 /// Return true if the CPU supports any kind of instruction fusion.
264 bool hasFusion() const {
265 return hasArithmeticBccFusion() || hasArithmeticCbzFusion() ||
266 hasFuseAES() || hasFuseArithmeticLogic() || hasFuseCmpCSel() ||
267 hasFuseFCmpFCSel() || hasFuseCmpCSet() || hasFuseAdrpAdd() ||
268 hasFuseLiterals() || hasFuseAppleSMECompute() || hasFuseFMinFMax();
269 }
270
271 /// Return true if the subtarget fuses this pair of move immediate
272 /// instructions.
273 bool fusesMOVImmPair(unsigned FirstOpc, unsigned FirstShift,
274 unsigned SecondOpc, unsigned SecondShift) const;
275
276 /// Return true if the subtarget fuses this pair of move immediate
277 /// instructions. The 1st instruction is a wildcard when it is nullptr, which
278 /// tells whether the 2nd one can be fused at all.
279 bool fusesMOVImmPair(const MachineInstr *FirstMI,
280 const MachineInstr &SecondMI) const;
281
284 }
285 unsigned getMaxInterleaveFactor() const { return MaxInterleaveFactor; }
286 unsigned getVectorInsertExtractBaseCost() const;
287 unsigned getCacheLineSize() const override { return CacheLineSize; }
288 unsigned getScatterOverhead() const { return ScatterOverhead; }
289 unsigned getGatherOverhead() const { return GatherOverhead; }
290 unsigned getPrefetchDistance() const override { return PrefetchDistance; }
291 unsigned getMinPrefetchStride(unsigned NumMemAccesses,
292 unsigned NumStridedMemAccesses,
293 unsigned NumPrefetches,
294 bool HasCall) const override {
295 return MinPrefetchStride;
296 }
297 unsigned getMaxPrefetchIterationsAhead() const override {
299 }
304
307 }
308
309 unsigned getMaximumJumpTableSize() const { return MaxJumpTableSize; }
310 unsigned getMinimumJumpTableEntries() const {
312 }
313
314 unsigned getFixedLoadLatency() const { return FixedLoadLatency; }
315
316 /// CPU has TBI (top byte of addresses is ignored during HW address
317 /// translation) and OS enables it.
319
320 bool isLittleEndian() const { return IsLittle; }
321
322 bool isTargetDarwin() const { return TargetTriple.isOSDarwin(); }
323 bool isTargetIOS() const { return TargetTriple.isiOS(); }
324 bool isTargetLinux() const { return TargetTriple.isOSLinux(); }
325 bool isTargetWindows() const { return TargetTriple.isOSWindows(); }
326 bool isTargetAndroid() const { return TargetTriple.isAndroid(); }
327 bool isTargetFuchsia() const { return TargetTriple.isOSFuchsia(); }
328 bool isWindowsArm64EC() const { return TargetTriple.isWindowsArm64EC(); }
329 bool isLFI() const { return TargetTriple.isLFI(); }
330
331 bool isTargetCOFF() const { return TargetTriple.isOSBinFormatCOFF(); }
332 bool isTargetELF() const { return TargetTriple.isOSBinFormatELF(); }
333 bool isTargetMachO() const { return TargetTriple.isOSBinFormatMachO(); }
334
335 bool isTargetILP32() const {
336 return TargetTriple.isArch32Bit() ||
337 TargetTriple.getEnvironment() == Triple::GNUILP32;
338 }
339
340 bool useAA() const override;
341
342 bool addrSinkUsingGEPs() const override {
343 // Keeping GEPs inbounds is important for exploiting AArch64
344 // addressing-modes in ILP32 mode.
345 return useAA() || isTargetILP32();
346 }
347
348 bool useSmallAddressing() const {
349 switch (TLInfo.getTargetMachine().getCodeModel()) {
351 // Kernel is currently allowed only for Fuchsia targets,
352 // where it is the same as Small for almost all purposes.
353 case CodeModel::Small:
354 return true;
355 default:
356 return false;
357 }
358 }
359
360 /// Returns whether the operating system makes it safer to store sensitive
361 /// values in x16 and x17 as opposed to other registers.
362 bool isX16X17Safer() const;
363
364 /// ParseSubtargetFeatures - Parses features string setting specified
365 /// subtarget options. Definition of function is auto generated by tblgen.
367
368 /// ClassifyGlobalReference - Find the target operand flags that describe
369 /// how a global value should be referenced for the current subtarget.
370 unsigned ClassifyGlobalReference(const GlobalValue *GV,
371 const TargetMachine &TM) const;
372
374 const TargetMachine &TM) const;
375
376 /// This function is design to compatible with the function def in other
377 /// targets and escape build error about the virtual function def in base
378 /// class TargetSubtargetInfo. Updeate me if AArch64 target need to use it.
379 unsigned char
381 return 0;
382 }
383
385 const SchedRegion &Region) const override;
386
387 void adjustSchedDependency(SUnit *Def, int DefOpIdx, SUnit *Use, int UseOpIdx,
388 SDep &Dep,
389 const TargetSchedModel *SchedModel) const override;
390
391 bool enableEarlyIfConversion() const override;
392
393 std::unique_ptr<PBQPRAConstraint> getCustomPBQPConstraints() const override;
394
395 bool isCallingConvWin64(CallingConv::ID CC, bool IsVarArg) const {
396 switch (CC) {
397 case CallingConv::C:
401 return isTargetWindows();
403 return IsVarArg && isTargetWindows();
405 return true;
406 default:
407 return false;
408 }
409 }
410
411 /// Return whether FrameLowering should always set the "extended frame
412 /// present" bit in FP, or set it based on a symbol in the runtime.
414 // Older OS versions (particularly system unwinders) are confused by the
415 // Swift extended frame, so when building code that might be run on them we
416 // must dynamically query the concurrency library to determine whether
417 // extended frames should be flagged as present.
418 const Triple &TT = getTargetTriple();
419
420 unsigned Major = TT.getOSVersion().getMajor();
421 switch(TT.getOS()) {
422 default:
423 return false;
424 case Triple::IOS:
425 case Triple::TvOS:
426 return Major < 15;
427 case Triple::WatchOS:
428 return Major < 8;
429 case Triple::MacOSX:
430 case Triple::Darwin:
431 return Major < 12;
432 }
433 }
434
435 void mirFileLoaded(MachineFunction &MF) const override;
436
437 // Return the known range for the bit length of SVE data registers. A value
438 // of 0 means nothing is known about that particular limit beyond what's
439 // implied by the architecture.
440 unsigned getMaxSVEVectorSizeInBits() const {
442 "Tried to get SVE vector length without SVE support!");
444 }
445
446 unsigned getMinSVEVectorSizeInBits() const {
448 "Tried to get SVE vector length without SVE support!");
450 }
451
452 // Return the known bit length of SVE data registers. A value of 0 means the
453 // length is unknown beyond what's implied by the architecture.
454 unsigned getSVEVectorSizeInBits() const {
456 "Tried to get SVE vector length without SVE support!");
459 return 0;
460 }
461
462 // Return the known bit length of SVE predicate registers. A value of 0 means
463 // the length is unknown beyond what's implied by the architecture.
464 unsigned getSVEPredicateSizeInBits() const {
465 return getSVEVectorSizeInBits() / 8;
466 }
467
470 return false;
471
472 // Prefer NEON unless larger SVE registers are available.
473 return !isNeonAvailable() || getMinSVEVectorSizeInBits() >= 256;
474 }
475
478 return false;
481 }
482
483 unsigned getVScaleForTuning() const { return VScaleForTuning; }
484
488
489 /// Returns true to use the addvl/inc/dec instructions, as opposed to separate
490 /// add + cnt instructions.
491 bool useScalarIncVL() const;
492
496
497 /// Choose a method of checking LR before performing a tail call.
500
501 /// Compute the integer discriminator for a given BlockAddress constant, if
502 /// blockaddress signing is enabled, or std::nullopt otherwise.
503 /// Blockaddress signing is controlled by the function attribute
504 /// "ptrauth-indirect-gotos" on the parent function.
505 /// Note that this assumes the discriminator is independent of the indirect
506 /// goto branch site itself, i.e., it's the same for all BlockAddresses in
507 /// a function.
508 std::optional<uint16_t>
510
511 bool enableAggressiveInterleaving() const { return AggressiveInterleaving; }
512};
513} // End llvm namespace
514
515#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...
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
std::optional< unsigned > StreamingHazardSize
AArch64FrameLowering FrameLowering
bool enableEarlyIfConversion() const override
const InlineAsmLowering * getInlineAsmLowering() const override
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 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...
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:181
Representation of each machine instruction.
Holds all the information related to register banks.
Scheduling dependency.
Definition ScheduleDAG.h:52
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:404
bool isFixedLengthVector() const
Definition ValueTypes.h:199
Define a generic scheduling policy for targets that don't provide their own MachineSchedStrategy.
A region of an MBB for scheduling.