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