LLVM 22.0.0git
AArch64ISelLowering.h
Go to the documentation of this file.
1//==-- AArch64ISelLowering.h - AArch64 DAG Lowering Interface ----*- 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 defines the interfaces that AArch64 uses to lower LLVM code into a
10// selection DAG.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_AARCH64_AARCH64ISELLOWERING_H
15#define LLVM_LIB_TARGET_AARCH64_AARCH64ISELLOWERING_H
16
21#include "llvm/IR/CallingConv.h"
22#include "llvm/IR/Instruction.h"
23
24namespace llvm {
25
26class AArch64TargetMachine;
27
28namespace AArch64 {
29/// Possible values of current rounding mode, which is specified in bits
30/// 23:22 of FPCR.
32 RN = 0, // Round to Nearest
33 RP = 1, // Round towards Plus infinity
34 RM = 2, // Round towards Minus infinity
35 RZ = 3, // Round towards Zero
36 rmMask = 3 // Bit mask selecting rounding mode
37};
38
39// Bit position of rounding mode bits in FPCR.
40const unsigned RoundingBitsPos = 22;
41
42// Reserved bits should be preserved when modifying FPCR.
43const uint64_t ReservedFPControlBits = 0xfffffffff80040f8;
44
45// Registers used to pass function arguments.
48
49/// Maximum allowed number of unprobed bytes above SP at an ABI
50/// boundary.
51const unsigned StackProbeMaxUnprobedStack = 1024;
52
53/// Maximum number of iterations to unroll for a constant size probing loop.
54const unsigned StackProbeMaxLoopUnroll = 4;
55
56} // namespace AArch64
57
58namespace ARM64AS {
59enum : unsigned { PTR32_SPTR = 270, PTR32_UPTR = 271, PTR64 = 272 };
60}
61
62class AArch64Subtarget;
63
65public:
66 explicit AArch64TargetLowering(const TargetMachine &TM,
67 const AArch64Subtarget &STI);
68
69 const AArch64TargetMachine &getTM() const;
70
71 /// Control the following reassociation of operands: (op (op x, c1), y) -> (op
72 /// (op x, y), c1) where N0 is (op x, c1) and N1 is y.
74 SDValue N1) const override;
75
76 /// Selects the correct CCAssignFn for a given CallingConvention value.
77 CCAssignFn *CCAssignFnForCall(CallingConv::ID CC, bool IsVarArg) const;
78
79 /// Selects the correct CCAssignFn for a given CallingConvention value.
81
82 /// Determine which of the bits specified in Mask are known to be either zero
83 /// or one and return them in the KnownZero/KnownOne bitsets.
85 const APInt &DemandedElts,
86 const SelectionDAG &DAG,
87 unsigned Depth = 0) const override;
88
90 const APInt &DemandedElts,
91 const SelectionDAG &DAG,
92 unsigned Depth) const override;
93
94 MVT getPointerTy(const DataLayout &DL, uint32_t AS = 0) const override {
95 if ((AS == ARM64AS::PTR32_SPTR) || (AS == ARM64AS::PTR32_UPTR)) {
96 // These are 32-bit pointers created using the `__ptr32` extension or
97 // similar. They are handled by marking them as being in a different
98 // address space, and will be extended to 64-bits when used as the target
99 // of a load or store operation, or cast to a 64-bit pointer type.
100 return MVT::i32;
101 } else {
102 // Returning i64 unconditionally here (i.e. even for ILP32) means that the
103 // *DAG* representation of pointers will always be 64-bits. They will be
104 // truncated and extended when transferred to memory, but the 64-bit DAG
105 // allows us to use AArch64's addressing modes much more easily.
106 return MVT::i64;
107 }
108 }
109
110 unsigned getVectorIdxWidth(const DataLayout &DL) const override {
111 // The VectorIdx type is i64, with both normal and ilp32.
112 return 64;
113 }
114
116 const APInt &DemandedElts,
117 TargetLoweringOpt &TLO) const override;
118
119 MVT getScalarShiftAmountTy(const DataLayout &DL, EVT) const override;
120
121 /// Returns true if the target allows unaligned memory accesses of the
122 /// specified type.
124 EVT VT, unsigned AddrSpace = 0, Align Alignment = Align(1),
126 unsigned *Fast = nullptr) const override;
127 /// LLT variant.
128 bool allowsMisalignedMemoryAccesses(LLT Ty, unsigned AddrSpace,
129 Align Alignment,
131 unsigned *Fast = nullptr) const override;
132
133 /// Provide custom lowering hooks for some operations.
134 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
135
136 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
137
138 /// This method returns a target specific FastISel object, or null if the
139 /// target does not support "fast" ISel.
141 const TargetLibraryInfo *libInfo) const override;
142
143 bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override;
144
145 bool isFPImmLegal(const APFloat &Imm, EVT VT,
146 bool ForCodeSize) const override;
147
148 /// Return true if the given shuffle mask can be codegen'd directly, or if it
149 /// should be stack expanded.
150 bool isShuffleMaskLegal(ArrayRef<int> M, EVT VT) const override;
151
152 /// Similar to isShuffleMaskLegal. Return true is the given 'select with zero'
153 /// shuffle mask can be codegen'd directly.
154 bool isVectorClearMaskLegal(ArrayRef<int> M, EVT VT) const override;
155
156 /// Return the ISD::SETCC ValueType.
158 EVT VT) const override;
159
161
163 MachineBasicBlock *BB) const;
164
166 MachineBasicBlock *BB) const;
167
169 MachineBasicBlock *MBB) const;
170
171 MachineBasicBlock *EmitTileLoad(unsigned Opc, unsigned BaseReg,
173 MachineBasicBlock *BB) const;
175 MachineBasicBlock *EmitZAInstr(unsigned Opc, unsigned BaseReg,
176 MachineInstr &MI, MachineBasicBlock *BB) const;
178 unsigned Opcode, bool Op0IsDef) const;
180
181 // Note: The following group of functions are only used as part of the old SME
182 // ABI lowering. They will be removed once -aarch64-new-sme-abi=true is the
183 // default.
185 MachineBasicBlock *BB) const;
187 MachineBasicBlock *BB) const;
189 MachineBasicBlock *BB) const;
191 MachineBasicBlock *BB) const;
193 MachineBasicBlock *BB) const;
194
195 /// Replace (0, vreg) discriminator components with the operands of blend
196 /// or with (immediate, NoRegister) when possible.
198 MachineOperand &IntDiscOp,
199 MachineOperand &AddrDiscOp,
200 const TargetRegisterClass *AddrDiscRC) const;
201
204 MachineBasicBlock *MBB) const override;
205
206 bool getTgtMemIntrinsic(IntrinsicInfo &Info, const CallInst &I,
207 MachineFunction &MF,
208 unsigned Intrinsic) const override;
209
210 bool shouldReduceLoadWidth(SDNode *Load, ISD::LoadExtType ExtTy, EVT NewVT,
211 std::optional<unsigned> ByteOffset) const override;
212
213 bool shouldRemoveRedundantExtend(SDValue Op) const override;
214
215 bool isTruncateFree(Type *Ty1, Type *Ty2) const override;
216 bool isTruncateFree(EVT VT1, EVT VT2) const override;
217
218 bool isProfitableToHoist(Instruction *I) const override;
219
220 bool isZExtFree(Type *Ty1, Type *Ty2) const override;
221 bool isZExtFree(EVT VT1, EVT VT2) const override;
222 bool isZExtFree(SDValue Val, EVT VT2) const override;
223
225 Instruction *I, Loop *L, const TargetTransformInfo &TTI) const override;
226
227 bool hasPairedLoad(EVT LoadedType, Align &RequiredAlignment) const override;
228
229 unsigned getMaxSupportedInterleaveFactor() const override { return 4; }
230
231 bool lowerInterleavedLoad(Instruction *Load, Value *Mask,
233 ArrayRef<unsigned> Indices, unsigned Factor,
234 const APInt &GapMask) const override;
235 bool lowerInterleavedStore(Instruction *Store, Value *Mask,
236 ShuffleVectorInst *SVI, unsigned Factor,
237 const APInt &GapMask) const override;
238
240 IntrinsicInst *DI) const override;
241
243 Instruction *Store, Value *Mask,
244 ArrayRef<Value *> InterleaveValues) const override;
245
246 bool isLegalAddImmediate(int64_t) const override;
247 bool isLegalAddScalableImmediate(int64_t) const override;
248 bool isLegalICmpImmediate(int64_t) const override;
249
251 SDValue ConstNode) const override;
252
253 bool shouldConsiderGEPOffsetSplit() const override;
254
255 EVT getOptimalMemOpType(LLVMContext &Context, const MemOp &Op,
256 const AttributeList &FuncAttributes) const override;
257
259 const AttributeList &FuncAttributes) const override;
260
261 /// Return true if the addressing mode represented by AM is legal for this
262 /// target, for a load/store of the specified type.
263 bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty,
264 unsigned AS,
265 Instruction *I = nullptr) const override;
266
267 int64_t getPreferredLargeGEPBaseOffset(int64_t MinOffset,
268 int64_t MaxOffset) const override;
269
270 /// Return true if an FMA operation is faster than a pair of fmul and fadd
271 /// instructions. fmuladd intrinsics will be expanded to FMAs when this method
272 /// returns true, otherwise fmuladd is expanded to fmul + fadd.
274 EVT VT) const override;
275 bool isFMAFasterThanFMulAndFAdd(const Function &F, Type *Ty) const override;
276
278 CodeGenOptLevel OptLevel) const override;
279
280 /// Return true if the target has native support for
281 /// the specified value type and it is 'desirable' to use the type for the
282 /// given node type.
283 bool isTypeDesirableForOp(unsigned Opc, EVT VT) const override;
284
285 const MCPhysReg *getScratchRegisters(CallingConv::ID CC) const override;
287
288 /// Returns false if N is a bit extraction pattern of (X >> C) & Mask.
290 CombineLevel Level) const override;
291
292 bool isDesirableToPullExtFromShl(const MachineInstr &MI) const override {
293 return false;
294 }
295
296 /// Returns false if N is a bit extraction pattern of (X >> C) & Mask.
297 bool isDesirableToCommuteXorWithShift(const SDNode *N) const override;
298
299 /// Return true if it is profitable to fold a pair of shifts into a mask.
301 CombineLevel Level) const override;
302
303 bool shouldFoldSelectWithIdentityConstant(unsigned BinOpcode, EVT VT,
304 unsigned SelectOpcode, SDValue X,
305 SDValue Y) const override;
306
307 /// Returns true if it is beneficial to convert a load of a constant
308 /// to just the constant itself.
310 Type *Ty) const override;
311
312 /// Return true if EXTRACT_SUBVECTOR is cheap for this result type
313 /// with this index.
314 bool isExtractSubvectorCheap(EVT ResVT, EVT SrcVT,
315 unsigned Index) const override;
316
317 bool shouldFormOverflowOp(unsigned Opcode, EVT VT,
318 bool MathUsed) const override {
319 // Using overflow ops for overflow checks only should beneficial on
320 // AArch64.
321 return TargetLowering::shouldFormOverflowOp(Opcode, VT, true);
322 }
323
324 Value *emitLoadLinked(IRBuilderBase &Builder, Type *ValueTy, Value *Addr,
325 AtomicOrdering Ord) const override;
327 AtomicOrdering Ord) const override;
328
329 void emitAtomicCmpXchgNoStoreLLBalance(IRBuilderBase &Builder) const override;
330
331 bool isOpSuitableForLDPSTP(const Instruction *I) const;
332 bool isOpSuitableForLSE128(const Instruction *I) const;
333 bool isOpSuitableForRCPC3(const Instruction *I) const;
334 bool shouldInsertFencesForAtomic(const Instruction *I) const override;
335 bool
337
339 shouldExpandAtomicLoadInIR(LoadInst *LI) const override;
341 shouldExpandAtomicStoreInIR(StoreInst *SI) const override;
343 shouldExpandAtomicRMWInIR(AtomicRMWInst *AI) const override;
344
347
348 bool useLoadStackGuardNode(const Module &M) const override;
350 getPreferredVectorAction(MVT VT) const override;
351
352 /// If the target has a standard location for the stack protector cookie,
353 /// returns the address of that location. Otherwise, returns nullptr.
354 Value *getIRStackGuard(IRBuilderBase &IRB) const override;
355
356 void insertSSPDeclarations(Module &M) const override;
357 Function *getSSPStackGuardCheck(const Module &M) const override;
358
359 /// If the target has a standard location for the unsafe stack pointer,
360 /// returns the address of that location. Otherwise, returns nullptr.
361 Value *getSafeStackPointerLocation(IRBuilderBase &IRB) const override;
362
363 /// If a physical register, this returns the register that receives the
364 /// exception address on entry to an EH pad.
366 getExceptionPointerRegister(const Constant *PersonalityFn) const override;
367
368 /// If a physical register, this returns the register that receives the
369 /// exception typeid on entry to a landing pad.
371 getExceptionSelectorRegister(const Constant *PersonalityFn) const override;
372
373 bool isIntDivCheap(EVT VT, AttributeList Attr) const override;
374
375 bool canMergeStoresTo(unsigned AddressSpace, EVT MemVT,
376 const MachineFunction &MF) const override;
377
378 bool isCheapToSpeculateCttz(Type *) const override {
379 return true;
380 }
381
382 bool isCheapToSpeculateCtlz(Type *) const override {
383 return true;
384 }
385
386 bool isMaskAndCmp0FoldingBeneficial(const Instruction &AndI) const override;
387
388 bool hasAndNotCompare(SDValue V) const override {
389 // We can use bics for any scalar.
390 return V.getValueType().isScalarInteger();
391 }
392
393 bool hasAndNot(SDValue Y) const override {
394 EVT VT = Y.getValueType();
395
396 if (!VT.isVector())
397 return hasAndNotCompare(Y);
398
399 if (VT.isScalableVector())
400 return true;
401
402 return VT.getFixedSizeInBits() >= 64; // vector 'bic'
403 }
404
407 unsigned OldShiftOpcode, unsigned NewShiftOpcode,
408 SelectionDAG &DAG) const override;
409
412 unsigned ExpansionFactor) const override;
413
415 unsigned KeptBits) const override {
416 // For vectors, we don't have a preference..
417 if (XVT.isVector())
418 return false;
419
420 auto VTIsOk = [](EVT VT) -> bool {
421 return VT == MVT::i8 || VT == MVT::i16 || VT == MVT::i32 ||
422 VT == MVT::i64;
423 };
424
425 // We are ok with KeptBitsVT being byte/word/dword, what SXT supports.
426 // XVT will be larger than KeptBitsVT.
427 MVT KeptBitsVT = MVT::getIntegerVT(KeptBits);
428 return VTIsOk(XVT) && VTIsOk(KeptBitsVT);
429 }
430
431 bool preferIncOfAddToSubOfNot(EVT VT) const override;
432
433 bool shouldConvertFpToSat(unsigned Op, EVT FPVT, EVT VT) const override;
434
435 bool shouldExpandCmpUsingSelects(EVT VT) const override;
436
437 bool isComplexDeinterleavingSupported() const override;
439 ComplexDeinterleavingOperation Operation, Type *Ty) const override;
440
443 ComplexDeinterleavingRotation Rotation, Value *InputA, Value *InputB,
444 Value *Accumulator = nullptr) const override;
445
446 bool supportSplitCSR(MachineFunction *MF) const override {
448 MF->getFunction().hasFnAttribute(Attribute::NoUnwind);
449 }
450 void initializeSplitCSR(MachineBasicBlock *Entry) const override;
452 MachineBasicBlock *Entry,
453 const SmallVectorImpl<MachineBasicBlock *> &Exits) const override;
454
455 bool supportSwiftError() const override {
456 return true;
457 }
458
459 bool supportPtrAuthBundles() const override { return true; }
460
461 bool supportKCFIBundles() const override { return true; }
462
465 const TargetInstrInfo *TII) const override;
466
467 /// Enable aggressive FMA fusion on targets that want it.
468 bool enableAggressiveFMAFusion(EVT VT) const override;
469
470 bool aggressivelyPreferBuildVectorSources(EVT VecVT) const override {
471 return true;
472 }
473
474 /// Returns the size of the platform's va_list object.
475 unsigned getVaListSizeInBits(const DataLayout &DL) const override;
476
477 /// Returns true if \p VecTy is a legal interleaved access type. This
478 /// function checks the vector element type and the overall width of the
479 /// vector.
481 bool &UseScalable) const;
482
483 /// Returns the number of interleaved accesses that will be generated when
484 /// lowering accesses of the given type.
485 unsigned getNumInterleavedAccesses(VectorType *VecTy, const DataLayout &DL,
486 bool UseScalable) const;
487
489 const Instruction &I) const override;
490
492 Type *Ty, CallingConv::ID CallConv, bool isVarArg,
493 const DataLayout &DL) const override;
494
495 /// Used for exception handling on Win64.
496 bool needsFixedCatchObjects() const override;
497
498 bool fallBackToDAGISel(const Instruction &Inst) const override;
499
500 /// SVE code generation for fixed length vectors does not custom lower
501 /// BUILD_VECTOR. This makes BUILD_VECTOR legalisation a source of stores to
502 /// merge. However, merging them creates a BUILD_VECTOR that is just as
503 /// illegal as the original, thus leading to an infinite legalisation loop.
504 /// NOTE: Once BUILD_VECTOR is legal or can be custom lowered for all legal
505 /// vector types this override can be removed.
506 bool mergeStoresAfterLegalization(EVT VT) const override;
507
508 // If the platform/function should have a redzone, return the size in bytes.
509 unsigned getRedZoneSize(const Function &F) const {
510 if (F.hasFnAttribute(Attribute::NoRedZone))
511 return 0;
512 return 128;
513 }
514
515 bool isAllActivePredicate(SelectionDAG &DAG, SDValue N) const;
517
519 bool AllowUnknown = false) const override;
520
521 bool shouldExpandGetActiveLaneMask(EVT VT, EVT OpVT) const override;
522
523 bool
525
526 bool shouldExpandCttzElements(EVT VT) const override;
527
528 bool shouldExpandVectorMatch(EVT VT, unsigned SearchSize) const override;
529
530 /// If a change in streaming mode is required on entry to/return from a
531 /// function call it emits and returns the corresponding SMSTART or SMSTOP
532 /// node. \p Condition should be one of the enum values from
533 /// AArch64SME::ToggleCondition.
535 SDValue Chain, SDValue InGlue,
536 unsigned Condition) const;
537
538 bool isVScaleKnownToBeAPowerOfTwo() const override { return true; }
539
540 // Normally SVE is only used for byte size vectors that do not fit within a
541 // NEON vector. This changes when OverrideNEON is true, allowing SVE to be
542 // used for 64bit and 128bit vectors as well.
543 bool useSVEForFixedLengthVectorVT(EVT VT, bool OverrideNEON = false) const;
544
545 // Follow NEON ABI rules even when using SVE for fixed length vectors.
547 EVT VT) const override;
550 EVT VT) const override;
552 CallingConv::ID CC, EVT VT,
553 EVT &IntermediateVT,
554 unsigned &NumIntermediates,
555 MVT &RegisterVT) const override;
556
557 /// True if stack clash protection is enabled for this functions.
558 bool hasInlineStackProbe(const MachineFunction &MF) const override;
559
560 /// In AArch64, true if FEAT_CPA is present. Allows pointer arithmetic
561 /// semantics to be preserved for instruction selection.
562 bool shouldPreservePtrArith(const Function &F, EVT PtrVT) const override;
563
564private:
565 /// Keep a pointer to the AArch64Subtarget around so that we can
566 /// make the right decision when generating code for different targets.
567 const AArch64Subtarget *Subtarget;
568
569 bool isExtFreeImpl(const Instruction *Ext) const override;
570
571 void addTypeForNEON(MVT VT);
572 void addTypeForFixedLengthSVE(MVT VT);
573 void addDRType(MVT VT);
574 void addQRType(MVT VT);
575
576 bool shouldExpandBuildVectorWithShuffles(EVT, unsigned) const override;
577
578 SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
579 bool isVarArg,
581 const SDLoc &DL, SelectionDAG &DAG,
582 SmallVectorImpl<SDValue> &InVals) const override;
583
584 void AdjustInstrPostInstrSelection(MachineInstr &MI,
585 SDNode *Node) const override;
586
587 SDValue LowerCall(CallLoweringInfo & /*CLI*/,
588 SmallVectorImpl<SDValue> &InVals) const override;
589
590 SDValue LowerCallResult(SDValue Chain, SDValue InGlue,
591 CallingConv::ID CallConv, bool isVarArg,
592 const SmallVectorImpl<CCValAssign> &RVLocs,
593 const SDLoc &DL, SelectionDAG &DAG,
594 SmallVectorImpl<SDValue> &InVals, bool isThisReturn,
595 SDValue ThisVal, bool RequiresSMChange) const;
596
597 SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
598 SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
599 SDValue LowerStore128(SDValue Op, SelectionDAG &DAG) const;
600 SDValue LowerABS(SDValue Op, SelectionDAG &DAG) const;
601
602 SDValue LowerMGATHER(SDValue Op, SelectionDAG &DAG) const;
603 SDValue LowerMSCATTER(SDValue Op, SelectionDAG &DAG) const;
604
605 SDValue LowerMLOAD(SDValue Op, SelectionDAG &DAG) const;
606
607 SDValue LowerVECTOR_COMPRESS(SDValue Op, SelectionDAG &DAG) const;
608
609 SDValue LowerINTRINSIC_W_CHAIN(SDValue Op, SelectionDAG &DAG) const;
610 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
611 SDValue LowerINTRINSIC_VOID(SDValue Op, SelectionDAG &DAG) const;
612
613 bool
614 isEligibleForTailCallOptimization(const CallLoweringInfo &CLI) const;
615
616 /// Finds the incoming stack arguments which overlap the given fixed stack
617 /// object and incorporates their load into the current chain. This prevents
618 /// an upcoming store from clobbering the stack argument before it's used.
619 SDValue addTokenForArgument(SDValue Chain, SelectionDAG &DAG,
620 MachineFrameInfo &MFI, int ClobberedFI) const;
621
622 bool DoesCalleeRestoreStack(CallingConv::ID CallCC, bool TailCallOpt) const;
623
624 void saveVarArgRegisters(CCState &CCInfo, SelectionDAG &DAG, const SDLoc &DL,
625 SDValue &Chain) const;
626
627 bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
628 bool isVarArg,
630 LLVMContext &Context, const Type *RetTy) const override;
631
632 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
634 const SmallVectorImpl<SDValue> &OutVals, const SDLoc &DL,
635 SelectionDAG &DAG) const override;
636
637 SDValue getTargetNode(GlobalAddressSDNode *N, EVT Ty, SelectionDAG &DAG,
638 unsigned Flag) const;
639 SDValue getTargetNode(JumpTableSDNode *N, EVT Ty, SelectionDAG &DAG,
640 unsigned Flag) const;
641 SDValue getTargetNode(ConstantPoolSDNode *N, EVT Ty, SelectionDAG &DAG,
642 unsigned Flag) const;
643 SDValue getTargetNode(BlockAddressSDNode *N, EVT Ty, SelectionDAG &DAG,
644 unsigned Flag) const;
645 SDValue getTargetNode(ExternalSymbolSDNode *N, EVT Ty, SelectionDAG &DAG,
646 unsigned Flag) const;
647 template <class NodeTy>
648 SDValue getGOT(NodeTy *N, SelectionDAG &DAG, unsigned Flags = 0) const;
649 template <class NodeTy>
650 SDValue getAddrLarge(NodeTy *N, SelectionDAG &DAG, unsigned Flags = 0) const;
651 template <class NodeTy>
652 SDValue getAddr(NodeTy *N, SelectionDAG &DAG, unsigned Flags = 0) const;
653 template <class NodeTy>
654 SDValue getAddrTiny(NodeTy *N, SelectionDAG &DAG, unsigned Flags = 0) const;
655 SDValue LowerADDROFRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
656 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
657 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
658 SDValue LowerDarwinGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
659 SDValue LowerELFGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
660 SDValue LowerELFTLSLocalExec(const GlobalValue *GV, SDValue ThreadBase,
661 const SDLoc &DL, SelectionDAG &DAG) const;
662 SDValue LowerELFTLSDescCallSeq(SDValue SymAddr, const SDLoc &DL,
663 SelectionDAG &DAG) const;
664 SDValue LowerWindowsGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
665 SDValue LowerPtrAuthGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
666 SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
667 SDValue LowerSETCCCARRY(SDValue Op, SelectionDAG &DAG) const;
668 SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
669 SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
670 SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
671 SDValue LowerSELECT_CC(ISD::CondCode CC, SDValue LHS, SDValue RHS,
672 SDValue TVal, SDValue FVal,
674 SDNodeFlags Flags, const SDLoc &dl,
675 SelectionDAG &DAG) const;
676 SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
677 SDValue LowerADJUST_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
678 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
679 SDValue LowerBR_JT(SDValue Op, SelectionDAG &DAG) const;
680 SDValue LowerBRIND(SDValue Op, SelectionDAG &DAG) const;
681 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
682 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
683 SDValue LowerAAPCS_VASTART(SDValue Op, SelectionDAG &DAG) const;
684 SDValue LowerDarwin_VASTART(SDValue Op, SelectionDAG &DAG) const;
685 SDValue LowerWin64_VASTART(SDValue Op, SelectionDAG &DAG) const;
686 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
687 SDValue LowerVACOPY(SDValue Op, SelectionDAG &DAG) const;
688 SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const;
689 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
690 SDValue LowerSPONENTRY(SDValue Op, SelectionDAG &DAG) const;
691 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
692 SDValue LowerGET_ROUNDING(SDValue Op, SelectionDAG &DAG) const;
693 SDValue LowerSET_ROUNDING(SDValue Op, SelectionDAG &DAG) const;
694 SDValue LowerGET_FPMODE(SDValue Op, SelectionDAG &DAG) const;
695 SDValue LowerSET_FPMODE(SDValue Op, SelectionDAG &DAG) const;
696 SDValue LowerRESET_FPMODE(SDValue Op, SelectionDAG &DAG) const;
697 SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
698 SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
699 SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
700 SDValue LowerZERO_EXTEND_VECTOR_INREG(SDValue Op, SelectionDAG &DAG) const;
701 SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
702 SDValue LowerSPLAT_VECTOR(SDValue Op, SelectionDAG &DAG) const;
703 SDValue LowerDUPQLane(SDValue Op, SelectionDAG &DAG) const;
704 SDValue LowerToPredicatedOp(SDValue Op, SelectionDAG &DAG,
705 unsigned NewOp) const;
706 SDValue LowerToScalableOp(SDValue Op, SelectionDAG &DAG) const;
707 SDValue LowerVECTOR_SPLICE(SDValue Op, SelectionDAG &DAG) const;
708 SDValue LowerEXTRACT_SUBVECTOR(SDValue Op, SelectionDAG &DAG) const;
709 SDValue LowerINSERT_SUBVECTOR(SDValue Op, SelectionDAG &DAG) const;
710 SDValue LowerVECTOR_DEINTERLEAVE(SDValue Op, SelectionDAG &DAG) const;
711 SDValue LowerVECTOR_INTERLEAVE(SDValue Op, SelectionDAG &DAG) const;
712 SDValue LowerVECTOR_HISTOGRAM(SDValue Op, SelectionDAG &DAG) const;
713 SDValue LowerPARTIAL_REDUCE_MLA(SDValue Op, SelectionDAG &DAG) const;
714 SDValue LowerGET_ACTIVE_LANE_MASK(SDValue Op, SelectionDAG &DAG) const;
715 SDValue LowerDIV(SDValue Op, SelectionDAG &DAG) const;
716 SDValue LowerMUL(SDValue Op, SelectionDAG &DAG) const;
717 SDValue LowerVectorSRA_SRL_SHL(SDValue Op, SelectionDAG &DAG) const;
718 SDValue LowerShiftParts(SDValue Op, SelectionDAG &DAG) const;
719 SDValue LowerVSETCC(SDValue Op, SelectionDAG &DAG) const;
720 SDValue LowerCTPOP_PARITY(SDValue Op, SelectionDAG &DAG) const;
721 SDValue LowerCTTZ(SDValue Op, SelectionDAG &DAG) const;
722 SDValue LowerBitreverse(SDValue Op, SelectionDAG &DAG) const;
723 SDValue LowerMinMax(SDValue Op, SelectionDAG &DAG) const;
724 SDValue LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const;
725 SDValue LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const;
726 SDValue LowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const;
727 SDValue LowerVectorFP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
728 SDValue LowerVectorFP_TO_INT_SAT(SDValue Op, SelectionDAG &DAG) const;
729 SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
730 SDValue LowerFP_TO_INT_SAT(SDValue Op, SelectionDAG &DAG) const;
731 SDValue LowerVectorXRINT(SDValue Op, SelectionDAG &DAG) const;
732 SDValue LowerINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
733 SDValue LowerVectorINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
734 SDValue LowerVectorOR(SDValue Op, SelectionDAG &DAG) const;
735 SDValue LowerXOR(SDValue Op, SelectionDAG &DAG) const;
736 SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
737 SDValue LowerFSINCOS(SDValue Op, SelectionDAG &DAG) const;
738 SDValue LowerBITCAST(SDValue Op, SelectionDAG &DAG) const;
739 SDValue LowerVSCALE(SDValue Op, SelectionDAG &DAG) const;
740 SDValue LowerTRUNCATE(SDValue Op, SelectionDAG &DAG) const;
741 SDValue LowerVECREDUCE(SDValue Op, SelectionDAG &DAG) const;
742 SDValue LowerATOMIC_LOAD_AND(SDValue Op, SelectionDAG &DAG) const;
743 SDValue LowerWindowsDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
744 SDValue LowerInlineDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
745 SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
746
747 SDValue LowerAVG(SDValue Op, SelectionDAG &DAG, unsigned NewOp) const;
748
749 SDValue LowerFixedLengthVectorIntDivideToSVE(SDValue Op,
750 SelectionDAG &DAG) const;
751 SDValue LowerFixedLengthVectorIntExtendToSVE(SDValue Op,
752 SelectionDAG &DAG) const;
753 SDValue LowerFixedLengthVectorLoadToSVE(SDValue Op, SelectionDAG &DAG) const;
754 SDValue LowerFixedLengthVectorMLoadToSVE(SDValue Op, SelectionDAG &DAG) const;
755 SDValue LowerVECREDUCE_SEQ_FADD(SDValue ScalarOp, SelectionDAG &DAG) const;
756 SDValue LowerPredReductionToSVE(SDValue ScalarOp, SelectionDAG &DAG) const;
757 SDValue LowerReductionToSVE(unsigned Opcode, SDValue ScalarOp,
758 SelectionDAG &DAG) const;
759 SDValue LowerFixedLengthVectorSelectToSVE(SDValue Op, SelectionDAG &DAG) const;
760 SDValue LowerFixedLengthVectorSetccToSVE(SDValue Op, SelectionDAG &DAG) const;
761 SDValue LowerFixedLengthVectorStoreToSVE(SDValue Op, SelectionDAG &DAG) const;
762 SDValue LowerFixedLengthVectorMStoreToSVE(SDValue Op,
763 SelectionDAG &DAG) const;
764 SDValue LowerFixedLengthVectorTruncateToSVE(SDValue Op,
765 SelectionDAG &DAG) const;
766 SDValue LowerFixedLengthExtractVectorElt(SDValue Op, SelectionDAG &DAG) const;
767 SDValue LowerFixedLengthInsertVectorElt(SDValue Op, SelectionDAG &DAG) const;
768 SDValue LowerFixedLengthBitcastToSVE(SDValue Op, SelectionDAG &DAG) const;
769 SDValue LowerFixedLengthConcatVectorsToSVE(SDValue Op,
770 SelectionDAG &DAG) const;
771 SDValue LowerFixedLengthFPExtendToSVE(SDValue Op, SelectionDAG &DAG) const;
772 SDValue LowerFixedLengthFPRoundToSVE(SDValue Op, SelectionDAG &DAG) const;
773 SDValue LowerFixedLengthIntToFPToSVE(SDValue Op, SelectionDAG &DAG) const;
774 SDValue LowerFixedLengthFPToIntToSVE(SDValue Op, SelectionDAG &DAG) const;
775 SDValue LowerFixedLengthVECTOR_SHUFFLEToSVE(SDValue Op,
776 SelectionDAG &DAG) const;
777 SDValue LowerFixedLengthBuildVectorToSVE(SDValue Op, SelectionDAG &DAG) const;
778
779 SDValue BuildSDIVPow2(SDNode *N, const APInt &Divisor, SelectionDAG &DAG,
780 SmallVectorImpl<SDNode *> &Created) const override;
781 SDValue BuildSREMPow2(SDNode *N, const APInt &Divisor, SelectionDAG &DAG,
782 SmallVectorImpl<SDNode *> &Created) const override;
783 SDValue getSqrtEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
784 int &ExtraSteps, bool &UseOneConst,
785 bool Reciprocal) const override;
786 SDValue getRecipEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
787 int &ExtraSteps) const override;
788 SDValue getSqrtInputTest(SDValue Operand, SelectionDAG &DAG,
789 const DenormalMode &Mode) const override;
790 SDValue getSqrtResultForDenormInput(SDValue Operand,
791 SelectionDAG &DAG) const override;
792 unsigned combineRepeatedFPDivisors() const override;
793
794 ConstraintType getConstraintType(StringRef Constraint) const override;
795 Register getRegisterByName(const char* RegName, LLT VT,
796 const MachineFunction &MF) const override;
797
798 /// Examine constraint string and operand type and determine a weight value.
799 /// The operand object must already have been set up with the operand type.
801 getSingleConstraintMatchWeight(AsmOperandInfo &info,
802 const char *constraint) const override;
803
804 std::pair<unsigned, const TargetRegisterClass *>
805 getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
806 StringRef Constraint, MVT VT) const override;
807
808 const char *LowerXConstraint(EVT ConstraintVT) const override;
809
810 void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint,
811 std::vector<SDValue> &Ops,
812 SelectionDAG &DAG) const override;
813
815 getInlineAsmMemConstraint(StringRef ConstraintCode) const override {
816 if (ConstraintCode == "Q")
818 // FIXME: clang has code for 'Ump', 'Utf', 'Usa', and 'Ush' but these are
819 // followed by llvm_unreachable so we'll leave them unimplemented in
820 // the backend for now.
821 return TargetLowering::getInlineAsmMemConstraint(ConstraintCode);
822 }
823
824 /// Handle Lowering flag assembly outputs.
825 SDValue LowerAsmOutputForConstraint(SDValue &Chain, SDValue &Flag,
826 const SDLoc &DL,
827 const AsmOperandInfo &Constraint,
828 SelectionDAG &DAG) const override;
829
830 bool shouldExtendGSIndex(EVT VT, EVT &EltTy) const override;
831 bool shouldRemoveExtendFromGSIndex(SDValue Extend, EVT DataVT) const override;
832 bool isVectorLoadExtDesirable(SDValue ExtVal) const override;
833 bool isUsedByReturnOnly(SDNode *N, SDValue &Chain) const override;
834 bool mayBeEmittedAsTailCall(const CallInst *CI) const override;
835 bool getIndexedAddressParts(SDNode *N, SDNode *Op, SDValue &Base,
836 SDValue &Offset, SelectionDAG &DAG) const;
837 bool getPreIndexedAddressParts(SDNode *N, SDValue &Base, SDValue &Offset,
839 SelectionDAG &DAG) const override;
840 bool getPostIndexedAddressParts(SDNode *N, SDNode *Op, SDValue &Base,
841 SDValue &Offset, ISD::MemIndexedMode &AM,
842 SelectionDAG &DAG) const override;
843 bool isIndexingLegal(MachineInstr &MI, Register Base, Register Offset,
844 bool IsPre, MachineRegisterInfo &MRI) const override;
845
846 void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
847 SelectionDAG &DAG) const override;
848 void ReplaceBITCASTResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
849 SelectionDAG &DAG) const;
850 void ReplaceExtractSubVectorResults(SDNode *N,
851 SmallVectorImpl<SDValue> &Results,
852 SelectionDAG &DAG) const;
853 void ReplaceGetActiveLaneMaskResults(SDNode *N,
854 SmallVectorImpl<SDValue> &Results,
855 SelectionDAG &DAG) const;
856
857 bool shouldNormalizeToSelectSequence(LLVMContext &, EVT) const override;
858
859 void finalizeLowering(MachineFunction &MF) const override;
860
861 bool shouldLocalize(const MachineInstr &MI,
862 const TargetTransformInfo *TTI) const override;
863
864 bool SimplifyDemandedBitsForTargetNode(SDValue Op,
865 const APInt &OriginalDemandedBits,
866 const APInt &OriginalDemandedElts,
867 KnownBits &Known,
868 TargetLoweringOpt &TLO,
869 unsigned Depth) const override;
870
871 bool isTargetCanonicalConstantNode(SDValue Op) const override;
872
873 // With the exception of data-predicate transitions, no instructions are
874 // required to cast between legal scalable vector types. However:
875 // 1. Packed and unpacked types have different bit lengths, meaning BITCAST
876 // is not universally useable.
877 // 2. Most unpacked integer types are not legal and thus integer extends
878 // cannot be used to convert between unpacked and packed types.
879 // These can make "bitcasting" a multiphase process. REINTERPRET_CAST is used
880 // to transition between unpacked and packed types of the same element type,
881 // with BITCAST used otherwise.
882 // This function does not handle predicate bitcasts.
883 SDValue getSVESafeBitCast(EVT VT, SDValue Op, SelectionDAG &DAG) const;
884
885 // Returns the runtime value for PSTATE.SM by generating a call to
886 // __arm_sme_state.
887 SDValue getRuntimePStateSM(SelectionDAG &DAG, SDValue Chain, SDLoc DL,
888 EVT VT) const;
889
890 bool preferScalarizeSplat(SDNode *N) const override;
891
892 unsigned getMinimumJumpTableEntries() const override;
893
894 bool softPromoteHalfType() const override { return true; }
895
896 bool shouldScalarizeBinop(SDValue VecOp) const override {
897 return VecOp.getOpcode() == ISD::SETCC;
898 }
899
900 bool hasMultipleConditionRegisters(EVT VT) const override {
901 return VT.isScalableVector();
902 }
903};
904
905namespace AArch64 {
906FastISel *createFastISel(FunctionLoweringInfo &funcInfo,
907 const TargetLibraryInfo *libInfo);
908} // end namespace AArch64
909
910} // end namespace llvm
911
912#endif
unsigned const MachineRegisterInfo * MRI
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
Function Alias Analysis Results
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Analysis containing CSE Info
Definition: CSEInfo.cpp:27
return RetTy
uint64_t Addr
uint32_t Index
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
iv Induction Variable Users
Definition: IVUsers.cpp:48
#define RegName(no)
lazy value info
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
Register const TargetRegisterInfo * TRI
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
PowerPC Reduce CR logical Operation
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
This file describes how to lower LLVM code to machine code.
Value * RHS
Value * LHS
Register getExceptionPointerRegister(const Constant *PersonalityFn) const override
If a physical register, this returns the register that receives the exception address on entry to an ...
bool isTruncateFree(Type *Ty1, Type *Ty2) const override
Return true if it's free to truncate a value of type FromTy to type ToTy.
bool supportSplitCSR(MachineFunction *MF) const override
Return true if the target supports that a subset of CSRs for the given machine function is handled ex...
bool isFPImmLegal(const APFloat &Imm, EVT VT, bool ForCodeSize) const override
Returns true if the target can instruction select the specified FP immediate natively.
bool shouldExpandPartialReductionIntrinsic(const IntrinsicInst *I) const override
Return true if the @llvm.experimental.vector.partial.reduce.
MVT getRegisterTypeForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const override
Certain combinations of ABIs, Targets and features require that types are legal for some operations a...
bool shouldReduceLoadWidth(SDNode *Load, ISD::LoadExtType ExtTy, EVT NewVT, std::optional< unsigned > ByteOffset) const override
Return true if it is profitable to reduce a load to a smaller type.
void initializeSplitCSR(MachineBasicBlock *Entry) const override
Perform necessary initialization to handle a subset of CSRs explicitly via copies.
void computeKnownBitsForTargetNode(const SDValue Op, KnownBits &Known, const APInt &DemandedElts, const SelectionDAG &DAG, unsigned Depth=0) const override
Determine which of the bits specified in Mask are known to be either zero or one and return them in t...
bool hasAndNotCompare(SDValue V) const override
Return true if the target should transform: (X & Y) == Y —> (~X & Y) == 0 (X & Y) !...
TargetLoweringBase::LegalizeTypeAction getPreferredVectorAction(MVT VT) const override
Return the preferred vector type legalization action.
bool isShuffleMaskLegal(ArrayRef< int > M, EVT VT) const override
Return true if the given shuffle mask can be codegen'd directly, or if it should be stack expanded.
unsigned getVaListSizeInBits(const DataLayout &DL) const override
Returns the size of the platform's va_list object.
MachineBasicBlock * EmitZAInstr(unsigned Opc, unsigned BaseReg, MachineInstr &MI, MachineBasicBlock *BB) const
void insertCopiesSplitCSR(MachineBasicBlock *Entry, const SmallVectorImpl< MachineBasicBlock * > &Exits) const override
Insert explicit copies in entry and exit blocks.
int64_t getPreferredLargeGEPBaseOffset(int64_t MinOffset, int64_t MaxOffset) const override
Return the prefered common base offset.
bool shouldInsertTrailingFenceForAtomicStore(const Instruction *I) const override
Whether AtomicExpandPass should automatically insert a trailing fence without reducing the ordering f...
bool shouldExpandCttzElements(EVT VT) const override
Return true if the @llvm.experimental.cttz.elts intrinsic should be expanded using generic code in Se...
MachineBasicBlock * EmitInitTPIDR2Object(MachineInstr &MI, MachineBasicBlock *BB) const
bool lowerInterleavedStore(Instruction *Store, Value *Mask, ShuffleVectorInst *SVI, unsigned Factor, const APInt &GapMask) const override
Lower an interleaved store into a stN intrinsic.
MachineBasicBlock * EmitTileLoad(unsigned Opc, unsigned BaseReg, MachineInstr &MI, MachineBasicBlock *BB) const
unsigned getNumInterleavedAccesses(VectorType *VecTy, const DataLayout &DL, bool UseScalable) const
Returns the number of interleaved accesses that will be generated when lowering accesses of the given...
bool shouldConvertConstantLoadToIntImm(const APInt &Imm, Type *Ty) const override
Returns true if it is beneficial to convert a load of a constant to just the constant itself.
bool shouldExpandCmpUsingSelects(EVT VT) const override
Should we expand [US]CMP nodes using two selects and two compares, or by doing arithmetic on boolean ...
unsigned getNumRegistersForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const override
Certain targets require unusual breakdowns of certain types.
SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override
Provide custom lowering hooks for some operations.
bool shouldConvertFpToSat(unsigned Op, EVT FPVT, EVT VT) const override
Should we generate fp_to_si_sat and fp_to_ui_sat from type FPVT to type VT from min(max(fptoi)) satur...
bool canMergeStoresTo(unsigned AddressSpace, EVT MemVT, const MachineFunction &MF) const override
Returns if it's reasonable to merge stores to MemVT size.
bool aggressivelyPreferBuildVectorSources(EVT VecVT) const override
bool isIntDivCheap(EVT VT, AttributeList Attr) const override
Return true if integer divide is usually cheaper than a sequence of several shifts,...
bool shouldRemoveRedundantExtend(SDValue Op) const override
Return true (the default) if it is profitable to remove a sext_inreg(x) where the sext is redundant,...
CCAssignFn * CCAssignFnForReturn(CallingConv::ID CC) const
Selects the correct CCAssignFn for a given CallingConvention value.
bool supportPtrAuthBundles() const override
Return true if the target supports ptrauth operand bundles.
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const override
Return the ISD::SETCC ValueType.
bool optimizeExtendOrTruncateConversion(Instruction *I, Loop *L, const TargetTransformInfo &TTI) const override
Try to optimize extending or truncating conversion instructions (like zext, trunc,...
FastISel * createFastISel(FunctionLoweringInfo &funcInfo, const TargetLibraryInfo *libInfo) const override
This method returns a target specific FastISel object, or null if the target does not support "fast" ...
CCAssignFn * CCAssignFnForCall(CallingConv::ID CC, bool IsVarArg) const
Selects the correct CCAssignFn for a given CallingConvention value.
bool lowerDeinterleaveIntrinsicToLoad(Instruction *Load, Value *Mask, IntrinsicInst *DI) const override
Lower a deinterleave intrinsic to a target specific load intrinsic.
MachineMemOperand::Flags getTargetMMOFlags(const Instruction &I) const override
This callback is used to inspect load/store instructions and add target-specific MachineMemOperand fl...
unsigned getVectorIdxWidth(const DataLayout &DL) const override
Returns the type to be used for the index operand vector operations.
bool hasInlineStackProbe(const MachineFunction &MF) const override
True if stack clash protection is enabled for this functions.
bool shouldFoldSelectWithIdentityConstant(unsigned BinOpcode, EVT VT, unsigned SelectOpcode, SDValue X, SDValue Y) const override
Return true if pulling a binary operation into a select with an identity constant is profitable.
bool isLegalICmpImmediate(int64_t) const override
Return true if the specified immediate is legal icmp immediate, that is the target has icmp instructi...
Value * emitStoreConditional(IRBuilderBase &Builder, Value *Val, Value *Addr, AtomicOrdering Ord) const override
Perform a store-conditional operation to Addr.
bool preferIncOfAddToSubOfNot(EVT VT) const override
These two forms are equivalent: sub y, (xor x, -1) add (add x, 1), y The variant with two add's is IR...
TargetLoweringBase::AtomicExpansionKind shouldExpandAtomicLoadInIR(LoadInst *LI) const override
Returns how the given (atomic) load should be expanded by the IR-level AtomicExpand pass.
ShiftLegalizationStrategy preferredShiftLegalizationStrategy(SelectionDAG &DAG, SDNode *N, unsigned ExpansionFactor) const override
bool isOpSuitableForLSE128(const Instruction *I) const
bool isVScaleKnownToBeAPowerOfTwo() const override
Return true only if vscale must be a power of two.
TargetLoweringBase::AtomicExpansionKind shouldExpandAtomicCmpXchgInIR(AtomicCmpXchgInst *AI) const override
Returns how the given atomic cmpxchg should be expanded by the IR-level AtomicExpand pass.
void fixupPtrauthDiscriminator(MachineInstr &MI, MachineBasicBlock *BB, MachineOperand &IntDiscOp, MachineOperand &AddrDiscOp, const TargetRegisterClass *AddrDiscRC) const
Replace (0, vreg) discriminator components with the operands of blend or with (immediate,...
bool lowerInterleavedLoad(Instruction *Load, Value *Mask, ArrayRef< ShuffleVectorInst * > Shuffles, ArrayRef< unsigned > Indices, unsigned Factor, const APInt &GapMask) const override
Lower an interleaved load into a ldN intrinsic.
bool fallBackToDAGISel(const Instruction &Inst) const override
bool getTgtMemIntrinsic(IntrinsicInfo &Info, const CallInst &I, MachineFunction &MF, unsigned Intrinsic) const override
getTgtMemIntrinsic - Represent NEON load and store intrinsics as MemIntrinsicNodes.
bool isTypeDesirableForOp(unsigned Opc, EVT VT) const override
Return true if the target has native support for the specified value type and it is 'desirable' to us...
bool isLegalAddScalableImmediate(int64_t) const override
Return true if adding the specified scalable immediate is legal, that is the target has add instructi...
Function * getSSPStackGuardCheck(const Module &M) const override
If the target has a standard stack protection check function that performs validation and error handl...
bool shouldFormOverflowOp(unsigned Opcode, EVT VT, bool MathUsed) const override
Try to convert math with an overflow comparison into the corresponding DAG node operation.
TargetLoweringBase::AtomicExpansionKind shouldExpandAtomicRMWInIR(AtomicRMWInst *AI) const override
Returns how the IR-level AtomicExpand pass should expand the given AtomicRMW, if at all.
Value * createComplexDeinterleavingIR(IRBuilderBase &B, ComplexDeinterleavingOperation OperationType, ComplexDeinterleavingRotation Rotation, Value *InputA, Value *InputB, Value *Accumulator=nullptr) const override
Create the IR node for the given complex deinterleaving operation.
SDValue changeStreamingMode(SelectionDAG &DAG, SDLoc DL, bool Enable, SDValue Chain, SDValue InGlue, unsigned Condition) const
If a change in streaming mode is required on entry to/return from a function call it emits and return...
bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AddrSpace=0, Align Alignment=Align(1), MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *Fast=nullptr) const override
Returns true if the target allows unaligned memory accesses of the specified type.
unsigned getMaxSupportedInterleaveFactor() const override
Get the maximum supported factor for interleaved memory accesses.
bool isLegalInterleavedAccessType(VectorType *VecTy, const DataLayout &DL, bool &UseScalable) const
Returns true if VecTy is a legal interleaved access type.
void insertSSPDeclarations(Module &M) const override
Inserts necessary declarations for SSP (stack protection) purpose.
bool functionArgumentNeedsConsecutiveRegisters(Type *Ty, CallingConv::ID CallConv, bool isVarArg, const DataLayout &DL) const override
For some targets, an LLVM struct type must be broken down into multiple simple types,...
Value * emitLoadLinked(IRBuilderBase &Builder, Type *ValueTy, Value *Addr, AtomicOrdering Ord) const override
Perform a load-linked operation on Addr, returning a "Value *" with the corresponding pointee type.
MachineBasicBlock * EmitLoweredCatchRet(MachineInstr &MI, MachineBasicBlock *BB) const
bool isComplexDeinterleavingSupported() const override
Does this target support complex deinterleaving.
bool isZExtFree(Type *Ty1, Type *Ty2) const override
Return true if any actual instruction that defines a value of type FromTy implicitly zero-extends the...
EVT getAsmOperandValueType(const DataLayout &DL, Type *Ty, bool AllowUnknown=false) const override
SDValue ReconstructShuffle(SDValue Op, SelectionDAG &DAG) const
MachineBasicBlock * EmitZero(MachineInstr &MI, MachineBasicBlock *BB) const
SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override
This method will be invoked for all target nodes and for any target-independent nodes that the target...
Value * getSafeStackPointerLocation(IRBuilderBase &IRB) const override
If the target has a standard location for the unsafe stack pointer, returns the address of that locat...
bool isMaskAndCmp0FoldingBeneficial(const Instruction &AndI) const override
Return if the target supports combining a chain like:
bool isProfitableToHoist(Instruction *I) const override
Check if it is profitable to hoist instruction in then/else to if.
bool isOpSuitableForRCPC3(const Instruction *I) const
MVT getPointerTy(const DataLayout &DL, uint32_t AS=0) const override
Return the pointer type for the given address space, defaults to the pointer type from the data layou...
bool isCheapToSpeculateCttz(Type *) const override
Return true if it is cheap to speculate a call to intrinsic cttz.
unsigned getRedZoneSize(const Function &F) const
bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF, EVT VT) const override
Return true if an FMA operation is faster than a pair of fmul and fadd instructions.
MachineBasicBlock * EmitZTInstr(MachineInstr &MI, MachineBasicBlock *BB, unsigned Opcode, bool Op0IsDef) const
bool hasAndNot(SDValue Y) const override
Return true if the target has a bitwise and-not operation: X = ~A & B This can be used to simplify se...
MachineBasicBlock * EmitFill(MachineInstr &MI, MachineBasicBlock *BB) const
bool isCheapToSpeculateCtlz(Type *) const override
Return true if it is cheap to speculate a call to intrinsic ctlz.
bool shouldExpandVectorMatch(EVT VT, unsigned SearchSize) const override
Return true if the @llvm.experimental.vector.match intrinsic should be expanded for vector type ‘VT’ ...
MachineBasicBlock * EmitEntryPStateSM(MachineInstr &MI, MachineBasicBlock *BB) const
bool shouldInsertFencesForAtomic(const Instruction *I) const override
Whether AtomicExpandPass should automatically insert fences and reduce ordering for this atomic.
bool isReassocProfitable(SelectionDAG &DAG, SDValue N0, SDValue N1) const override
Control the following reassociation of operands: (op (op x, c1), y) -> (op (op x, y),...
bool shouldPreservePtrArith(const Function &F, EVT PtrVT) const override
In AArch64, true if FEAT_CPA is present.
TargetLoweringBase::AtomicExpansionKind shouldExpandAtomicStoreInIR(StoreInst *SI) const override
Returns how the given (atomic) store should be expanded by the IR-level AtomicExpand pass into.
MachineBasicBlock * EmitF128CSEL(MachineInstr &MI, MachineBasicBlock *BB) const
LLT getOptimalMemOpLLT(const MemOp &Op, const AttributeList &FuncAttributes) const override
LLT returning variant.
bool isDesirableToPullExtFromShl(const MachineInstr &MI) const override
GlobalISel - return true if it's profitable to perform the combine: shl ([sza]ext x),...
bool shouldProduceAndByConstByHoistingConstFromShiftsLHSOfAnd(SDValue X, ConstantSDNode *XC, ConstantSDNode *CC, SDValue Y, unsigned OldShiftOpcode, unsigned NewShiftOpcode, SelectionDAG &DAG) const override
Given the pattern (X & (C l>>/<< Y)) ==/!= 0 return true if it should be transformed into: ((X <</l>>...
MachineBasicBlock * EmitAllocateSMESaveBuffer(MachineInstr &MI, MachineBasicBlock *BB) const
bool isOffsetFoldingLegal(const GlobalAddressSDNode *GA) const override
Return true if folding a constant offset with the given GlobalAddress is legal.
bool needsFixedCatchObjects() const override
Used for exception handling on Win64.
MachineBasicBlock * EmitAllocateZABuffer(MachineInstr &MI, MachineBasicBlock *BB) const
const AArch64TargetMachine & getTM() const
unsigned getVectorTypeBreakdownForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const override
Certain targets such as MIPS require that some types such as vectors are always broken down into scal...
Value * getIRStackGuard(IRBuilderBase &IRB) const override
If the target has a standard location for the stack protector cookie, returns the address of that loc...
bool targetShrinkDemandedConstant(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, TargetLoweringOpt &TLO) const override
EVT getOptimalMemOpType(LLVMContext &Context, const MemOp &Op, const AttributeList &FuncAttributes) const override
Returns the target specific optimal type for load and store operations as a result of memset,...
bool generateFMAsInMachineCombiner(EVT VT, CodeGenOptLevel OptLevel) const override
bool isComplexDeinterleavingOperationSupported(ComplexDeinterleavingOperation Operation, Type *Ty) const override
Does this target support complex deinterleaving with the given operation and type.
bool isOpSuitableForLDPSTP(const Instruction *I) const
bool shouldFoldConstantShiftPairToMask(const SDNode *N, CombineLevel Level) const override
Return true if it is profitable to fold a pair of shifts into a mask.
MachineBasicBlock * EmitGetSMESaveSize(MachineInstr &MI, MachineBasicBlock *BB) const
bool hasPairedLoad(EVT LoadedType, Align &RequiredAlignment) const override
Return true if the target supplies and combines to a paired load two loaded values of type LoadedType...
bool isLegalAddImmediate(int64_t) const override
Return true if the specified immediate is legal add immediate, that is the target has add instruction...
bool shouldConsiderGEPOffsetSplit() const override
bool shouldTransformSignedTruncationCheck(EVT XVT, unsigned KeptBits) const override
Should we tranform the IR-optimal check for whether given truncation down into KeptBits would be trun...
bool isVectorClearMaskLegal(ArrayRef< int > M, EVT VT) const override
Similar to isShuffleMaskLegal.
const MCPhysReg * getScratchRegisters(CallingConv::ID CC) const override
Returns a 0 terminated array of registers that can be safely used as scratch registers.
void emitAtomicCmpXchgNoStoreLLBalance(IRBuilderBase &Builder) const override
Register getExceptionSelectorRegister(const Constant *PersonalityFn) const override
If a physical register, this returns the register that receives the exception typeid on entry to a la...
bool useLoadStackGuardNode(const Module &M) const override
If this function returns true, SelectionDAGBuilder emits a LOAD_STACK_GUARD node when it is lowering ...
MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr &MI, MachineBasicBlock *MBB) const override
This method should be implemented by targets that mark instructions with the 'usesCustomInserter' fla...
bool isExtractSubvectorCheap(EVT ResVT, EVT SrcVT, unsigned Index) const override
Return true if EXTRACT_SUBVECTOR is cheap for this result type with this index.
ArrayRef< MCPhysReg > getRoundingControlRegisters() const override
Returns a 0 terminated array of rounding control registers that can be attached into strict FP call.
bool lowerInterleaveIntrinsicToStore(Instruction *Store, Value *Mask, ArrayRef< Value * > InterleaveValues) const override
Lower an interleave intrinsic to a target specific store intrinsic.
MachineInstr * EmitKCFICheck(MachineBasicBlock &MBB, MachineBasicBlock::instr_iterator &MBBI, const TargetInstrInfo *TII) const override
bool isAllActivePredicate(SelectionDAG &DAG, SDValue N) const
bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty, unsigned AS, Instruction *I=nullptr) const override
Return true if the addressing mode represented by AM is legal for this target, for a load/store of th...
unsigned ComputeNumSignBitsForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, unsigned Depth) const override
This method can be implemented by targets that want to expose additional information about sign bits ...
bool isDesirableToCommuteXorWithShift(const SDNode *N) const override
Returns false if N is a bit extraction pattern of (X >> C) & Mask.
bool isDesirableToCommuteWithShift(const SDNode *N, CombineLevel Level) const override
Returns false if N is a bit extraction pattern of (X >> C) & Mask.
bool supportSwiftError() const override
Return true if the target supports swifterror attribute.
bool enableAggressiveFMAFusion(EVT VT) const override
Enable aggressive FMA fusion on targets that want it.
MVT getScalarShiftAmountTy(const DataLayout &DL, EVT) const override
Return the type to use for a scalar shift opcode, given the shifted amount type.
MachineBasicBlock * EmitDynamicProbedAlloc(MachineInstr &MI, MachineBasicBlock *MBB) const
bool shouldExpandGetActiveLaneMask(EVT VT, EVT OpVT) const override
Return true if the @llvm.get.active.lane.mask intrinsic should be expanded using generic code in Sele...
bool supportKCFIBundles() const override
Return true if the target supports kcfi operand bundles.
bool isMulAddWithConstProfitable(SDValue AddNode, SDValue ConstNode) const override
Return true if it may be profitable to transform (mul (add x, c1), c2) -> (add (mul x,...
bool useSVEForFixedLengthVectorVT(EVT VT, bool OverrideNEON=false) const
bool mergeStoresAfterLegalization(EVT VT) const override
SVE code generation for fixed length vectors does not custom lower BUILD_VECTOR.
Class for arbitrary precision integers.
Definition: APInt.h:78
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
An instruction that atomically checks whether a specified value is in a memory location,...
Definition: Instructions.h:506
an instruction that atomically reads a memory location, combines it with another value,...
Definition: Instructions.h:709
CCState - This class holds information needed while lowering arguments and return values.
This class represents a function call, abstracting a target machine's calling convention.
This is an important base class in LLVM.
Definition: Constant.h:43
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:63
This is a fast-path instruction selection class that generates poor code and doesn't support illegal ...
Definition: FastISel.h:66
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
CallingConv::ID getCallingConv() const
getCallingConv()/setCallingConv(CC) - These method get and set the calling convention of this functio...
Definition: Function.h:270
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
Definition: Function.cpp:727
Common base class shared among various IRBuilders.
Definition: IRBuilder.h:114
A wrapper class for inspecting calls to intrinsic functions.
Definition: IntrinsicInst.h:49
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:68
An instruction for reading from memory.
Definition: Instructions.h:180
Represents a single loop in the control flow graph.
Definition: LoopInfo.h:40
Machine Value Type.
static MVT getIntegerVT(unsigned BitWidth)
Instructions::iterator instr_iterator
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
Function & getFunction()
Return the LLVM function that this machine code represents.
Representation of each machine instruction.
Definition: MachineInstr.h:72
Flags
Flags values. These may be or'd together.
MachineOperand class - Representation of each machine instruction operand.
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:67
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
Definition: SelectionDAG.h:229
This instruction constructs a fixed permutation of two input vectors.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:574
An instruction for storing to memory.
Definition: Instructions.h:296
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:55
TargetInstrInfo - Interface to description of machine instruction set.
Provides information about what library functions are available for the current target.
virtual bool shouldFormOverflowOp(unsigned Opcode, EVT VT, bool MathUsed) const
Try to convert math with an overflow comparison into the corresponding DAG node operation.
ShiftLegalizationStrategy
Return the preferred strategy to legalize tihs SHIFT instruction, with ExpansionFactor being the recu...
LegalizeTypeAction
This enum indicates whether a types are legal for a target, and if not, what action should be used to...
AtomicExpansionKind
Enum that specifies what an atomic load/AtomicRMWInst is expanded to, if at all.
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
virtual InlineAsm::ConstraintCode getInlineAsmMemConstraint(StringRef ConstraintCode) const
Primary interface to the complete machine description for the target machine.
Definition: TargetMachine.h:83
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
LLVM Value Representation.
Definition: Value.h:75
Base class of all SIMD vector types.
Definition: DerivedTypes.h:430
A range adaptor for a pair of iterators.
ArrayRef< MCPhysReg > getFPRArgRegs()
Rounding
Possible values of current rounding mode, which is specified in bits 23:22 of FPCR.
const unsigned StackProbeMaxLoopUnroll
Maximum number of iterations to unroll for a constant size probing loop.
const unsigned StackProbeMaxUnprobedStack
Maximum allowed number of unprobed bytes above SP at an ABI boundary.
const unsigned RoundingBitsPos
const uint64_t ReservedFPControlBits
ArrayRef< MCPhysReg > getGPRArgRegs()
FastISel * createFastISel(FunctionLoweringInfo &funcInfo, const TargetLibraryInfo *libInfo)
@ CXX_FAST_TLS
Used for access functions.
Definition: CallingConv.h:72
@ Fast
Attempts to make calls as fast as possible (e.g.
Definition: CallingConv.h:41
@ SETCC
SetCC operator - This evaluates to a true value iff the condition is true.
Definition: ISDOpcodes.h:801
MemIndexedMode
MemIndexedMode enum - This enum defines the load / store indexed addressing modes.
Definition: ISDOpcodes.h:1634
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
Definition: ISDOpcodes.h:1685
LoadExtType
LoadExtType enum - This enum defines the three variants of LOADEXT (load with extension).
Definition: ISDOpcodes.h:1665
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:477
bool CCAssignFn(unsigned ValNo, MVT ValVT, MVT LocVT, CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags, Type *OrigTy, CCState &State)
CCAssignFn - This function assigns a location for Val, updating State to reflect the change.
CodeGenOptLevel
Code generation optimization level.
Definition: CodeGen.h:82
AtomicOrdering
Atomic ordering for LLVM's memory model.
TargetTransformInfo TTI
CombineLevel
Definition: DAGCombine.h:15
DWARFExpression::Operation Op
@ Enable
Enable colors.
#define N
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39
Represent subnormal handling kind for floating point instruction inputs and outputs.
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:376
bool isVector() const
Return true if this is a vector value type.
Definition: ValueTypes.h:168
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
Definition: ValueTypes.h:174
These are IR-level optimization flags that may be propagated to SDNodes.