LLVM 24.0.0git
X86ISelLowering.h
Go to the documentation of this file.
1//===-- X86ISelLowering.h - X86 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 X86 uses to lower LLVM code into a
10// selection DAG.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_X86_X86ISELLOWERING_H
15#define LLVM_LIB_TARGET_X86_X86ISELLOWERING_H
16
17#include "X86SelectionDAGInfo.h"
20
21namespace llvm {
22 class X86Subtarget;
23 class X86TargetMachine;
24
25 namespace X86 {
26 /// Current rounding mode is represented in bits 11:10 of FPSR. These
27 /// values are same as corresponding constants for rounding mode used
28 /// in glibc.
30 rmInvalid = -1, // For handle Invalid rounding mode
31 rmToNearest = 0, // FE_TONEAREST
32 rmDownward = 1 << 10, // FE_DOWNWARD
33 rmUpward = 2 << 10, // FE_UPWARD
34 rmTowardZero = 3 << 10, // FE_TOWARDZERO
35 rmMask = 3 << 10 // Bit mask selecting rounding mode
36 };
37 }
38
39 /// Define some predicates that are used for node matching.
40 namespace X86 {
41 /// Returns true if Elt is a constant zero or floating point constant +0.0.
42 bool isZeroNode(SDValue Elt);
43
44 /// Returns true of the given offset can be
45 /// fit into displacement field of the instruction.
47 bool hasSymbolicDisplacement);
48
49 /// Determines whether the callee is required to pop its
50 /// own arguments. Callee pop is necessary to support tail calls.
51 bool isCalleePop(CallingConv::ID CallingConv,
52 bool is64Bit, bool IsVarArg, bool GuaranteeTCO);
53
54 /// If Op is a constant whose elements are all the same constant or
55 /// undefined, return true and return the constant value in \p SplatVal.
56 /// If we have undef bits that don't cover an entire element, we treat these
57 /// as zero if AllowPartialUndefs is set, else we fail and return false.
58 bool isConstantSplat(SDValue Op, APInt &SplatVal,
59 bool AllowPartialUndefs = true);
60
61 /// Check if Op is a load operation that could be folded into some other x86
62 /// instruction as a memory operand. Example: vpaddd (%rdi), %xmm0, %xmm0.
63 bool mayFoldLoad(SDValue Op, const X86Subtarget &Subtarget,
64 bool AssumeSingleUse = false,
65 bool IgnoreAlignment = false);
66
67 /// Check if Op is a load operation that could be folded into a vector splat
68 /// instruction as a memory operand. Example: vbroadcastss 16(%rdi), %xmm2.
69 bool mayFoldLoadIntoBroadcastFromMem(SDValue Op, MVT EltVT,
70 const X86Subtarget &Subtarget,
71 bool AssumeSingleUse = false);
72
73 /// Check if Op is a value that could be used to fold a store into some
74 /// other x86 instruction as a memory operand. Ex: pextrb $0, %xmm0, (%rdi).
75 bool mayFoldIntoStore(SDValue Op);
76
77 /// Check if Op is an operation that could be folded into a zero extend x86
78 /// instruction.
79 bool mayFoldIntoZeroExtend(SDValue Op);
80
81 /// True if the target supports the extended frame for async Swift
82 /// functions.
83 bool isExtendedSwiftAsyncFrameSupported(const X86Subtarget &Subtarget,
84 const MachineFunction &MF);
85
86 /// Convert LLVM rounding mode to X86 rounding mode.
87 int getRoundingModeX86(unsigned RM);
88
89 } // end namespace X86
90
91 //===--------------------------------------------------------------------===//
92 // X86 Implementation of the TargetLowering interface
93 class X86TargetLowering final : public TargetLowering {
94 // Copying needed for an outgoing byval argument.
95 enum ByValCopyKind {
96 // Argument is already in the correct location, no copy needed.
97 NoCopy,
98 // Argument value is currently in the local stack frame, needs copying to
99 // outgoing arguemnt area.
100 CopyOnce,
101 // Argument value is currently in the outgoing argument area, but not at
102 // the correct offset, so needs copying via a temporary in local stack
103 // space.
104 CopyViaTemp,
105 };
106
107 public:
108 explicit X86TargetLowering(const X86TargetMachine &TM,
109 const X86Subtarget &STI);
110
111 unsigned getJumpTableEncoding() const override;
112 bool useSoftFloat() const override;
113
114 void markLibCallAttributes(MachineFunction *MF, unsigned CC,
115 ArgListTy &Args) const override;
116
117 MVT getScalarShiftAmountTy(const DataLayout &, EVT VT) const override {
118 return MVT::i8;
119 }
120
121 const MCExpr *
123 const MachineBasicBlock *MBB, unsigned uid,
124 MCContext &Ctx) const override;
125
126 /// Returns relocation base for the given PIC jumptable.
128 SelectionDAG &DAG) const override;
129 const MCExpr *
131 unsigned JTI, MCContext &Ctx) const override;
132
133 /// Return the desired alignment for ByVal aggregate
134 /// function arguments in the caller parameter area. For X86, aggregates
135 /// that contains are placed at 16-byte boundaries while the rest are at
136 /// 4-byte boundaries.
137 Align getByValTypeAlignment(Type *Ty, const DataLayout &DL) const override;
138
139 EVT getOptimalMemOpType(LLVMContext &Context, const MemOp &Op,
140 const AttributeList &FuncAttributes) const override;
141
142 /// Returns true if it's safe to use load / store of the
143 /// specified type to expand memcpy / memset inline. This is mostly true
144 /// for all types except for some special cases. For example, on X86
145 /// targets without SSE2 f64 load / store are done with fldl / fstpl which
146 /// also does type conversion. Note the specified type doesn't have to be
147 /// legal as the hook is used before type legalization.
148 bool isSafeMemOpType(MVT VT) const override;
149
150 bool isMemoryAccessFast(EVT VT, Align Alignment) const;
151
152 /// Returns true if the target allows unaligned memory accesses of the
153 /// specified type. Returns whether it is "fast" in the last argument.
154 bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS, Align Alignment,
156 unsigned *Fast) const override;
157
158 /// This function returns true if the memory access is aligned or if the
159 /// target allows this specific unaligned memory access. If the access is
160 /// allowed, the optional final parameter returns a relative speed of the
161 /// access (as defined by the target).
163 LLVMContext &Context, const DataLayout &DL, EVT VT, unsigned AddrSpace,
164 Align Alignment,
166 unsigned *Fast = nullptr) const override;
167
168 bool allowsMemoryAccess(LLVMContext &Context, const DataLayout &DL, EVT VT,
169 const MachineMemOperand &MMO,
170 unsigned *Fast) const {
171 return allowsMemoryAccess(Context, DL, VT, MMO.getAddrSpace(),
172 MMO.getAlign(), MMO.getFlags(), Fast);
173 }
174
175 /// Provide custom lowering hooks for some operations.
176 ///
177 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
178
179 /// Replace the results of node with an illegal result
180 /// type with new values built out of custom code.
181 ///
183 SelectionDAG &DAG) const override;
184
185 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
186
187 bool preferABDSToABSWithNSW(EVT VT) const override;
188
189 bool preferSextInRegOfTruncate(EVT TruncVT, EVT VT,
190 EVT ExtVT) const override;
191
193 EVT VT) const override;
194
195 /// Return true if the target has native support for
196 /// the specified value type and it is 'desirable' to use the type for the
197 /// given node type. e.g. On x86 i16 is legal, but undesirable since i16
198 /// instruction encodings are longer and some i16 instructions are slow.
199 bool isTypeDesirableForOp(unsigned Opc, EVT VT) const override;
200
201 /// Return true if the target has native support for the
202 /// specified value type and it is 'desirable' to use the type. e.g. On x86
203 /// i16 is legal, but undesirable since i16 instruction encodings are longer
204 /// and some i16 instructions are slow.
205 bool IsDesirableToPromoteOp(SDValue Op, EVT &PVT) const override;
206
207 /// Return prefered fold type, Abs if this is a vector, AddAnd if its an
208 /// integer, None otherwise.
211 const SDNode *SETCC0,
212 const SDNode *SETCC1) const override;
213
214 /// Return the newly negated expression if the cost is not expensive and
215 /// set the cost in \p Cost to indicate that if it is cheaper or neutral to
216 /// do the negation.
218 bool LegalOperations, bool ForCodeSize,
220 unsigned Depth) const override;
221
224 MachineBasicBlock *MBB) const override;
225
226 /// Do not merge vector stores after legalization because that may conflict
227 /// with x86-specific store splitting optimizations.
228 bool mergeStoresAfterLegalization(EVT MemVT) const override {
229 return !MemVT.isVector();
230 }
231
232 bool canMergeStoresTo(unsigned AddressSpace, EVT MemVT,
233 const MachineFunction &MF) const override;
234
235 bool isCheapToSpeculateCttz(Type *Ty) const override;
236
237 bool isCheapToSpeculateCtlz(Type *Ty) const override;
238
239 bool isCtlzFast() const override;
240
241 bool preferZeroCompareBranch() const override;
242
243 bool isMultiStoresCheaperThanBitsMerge(EVT LTy, EVT HTy) const override {
244 // If the pair to store is a mixture of float and int values, we will
245 // save two bitwise instructions and one float-to-int instruction and
246 // increase one store instruction. There is potentially a more
247 // significant benefit because it avoids the float->int domain switch
248 // for input value. So It is more likely a win.
249 if ((LTy.isFloatingPoint() && HTy.isInteger()) ||
250 (LTy.isInteger() && HTy.isFloatingPoint()))
251 return true;
252 // If the pair only contains int values, we will save two bitwise
253 // instructions and increase one store instruction (costing one more
254 // store buffer). Since the benefit is more blurred so we leave
255 // such pair out until we get testcase to prove it is a win.
256 return false;
257 }
258
259 bool isMaskAndCmp0FoldingBeneficial(const Instruction &AndI) const override;
260
261 bool hasAndNotCompare(SDValue Y) const override;
262
263 bool hasAndNot(SDValue Y) const override;
264
265 bool hasBitTest(SDValue X, SDValue Y) const override;
266
269 unsigned OldShiftOpcode, unsigned NewShiftOpcode,
270 SelectionDAG &DAG) const override;
271
273 EVT VT, unsigned ShiftOpc, bool MayTransformRotate,
274 const APInt &ShiftOrRotateAmt,
275 const std::optional<APInt> &AndMask) const override;
276
277 bool preferIncOfAddToSubOfNot(EVT VT) const override;
278
279 bool preferScalarizeSplat(SDNode *N) const override;
280
281 CondMergingParams
283 const Value *Rhs,
284 const Function *F) const override;
285
286 bool shouldFoldConstantShiftPairToMask(const SDNode *N) const override;
287
288 bool shouldFoldMaskToVariableShiftPair(SDValue Y) const override;
289
290 bool
292 unsigned KeptBits) const override {
293 // For vectors, we don't have a preference..
294 if (XVT.isVector())
295 return false;
296
297 auto VTIsOk = [](EVT VT) -> bool {
298 return VT == MVT::i8 || VT == MVT::i16 || VT == MVT::i32 ||
299 VT == MVT::i64;
300 };
301
302 // We are ok with KeptBitsVT being byte/word/dword, what MOVS supports.
303 // XVT will be larger than KeptBitsVT.
304 MVT KeptBitsVT = MVT::getIntegerVT(KeptBits);
305 return VTIsOk(XVT) && VTIsOk(KeptBitsVT);
306 }
307
310 unsigned ExpansionFactor) const override;
311
312 bool shouldSplatInsEltVarIndex(EVT VT) const override;
313
314 bool shouldConvertFpToSat(unsigned Op, EVT FPVT, EVT VT) const override {
315 // Converting to sat variants holds little benefit on X86 as we will just
316 // need to saturate the value back using fp arithmatic.
318 }
319
320 bool convertSetCCLogicToBitwiseLogic(EVT VT) const override {
321 return VT.isScalarInteger();
322 }
323
324 /// Vector-sized comparisons are fast using PCMPEQ + PMOVMSK or PTEST.
325 MVT hasFastEqualityCompare(unsigned NumBits) const override;
326
327 /// Return the value type to use for ISD::SETCC.
329 EVT VT) const override;
330
332 const APInt &DemandedElts,
333 TargetLoweringOpt &TLO) const override;
334
335 /// Determine which of the bits specified in Mask are known to be either
336 /// zero or one and return them in the KnownZero/KnownOne bitsets.
339 const APInt &DemandedElts,
340 const SelectionDAG &DAG,
341 unsigned Depth = 0) const override;
342
343 /// Determine the number of bits in the operation that are sign bits.
345 const APInt &DemandedElts,
346 const SelectionDAG &DAG,
347 unsigned Depth) const override;
348
350 const APInt &DemandedElts,
351 APInt &KnownUndef,
352 APInt &KnownZero,
353 TargetLoweringOpt &TLO,
354 unsigned Depth) const override;
355
357 const APInt &DemandedElts,
358 unsigned MaskIndex,
359 TargetLoweringOpt &TLO,
360 unsigned Depth) const;
361
363 SDValue Op, const APInt &DemandedElts) const override;
364
366 const APInt &DemandedBits,
367 const APInt &DemandedElts,
369 TargetLoweringOpt &TLO,
370 unsigned Depth) const override;
371
373 SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts,
374 SelectionDAG &DAG, unsigned Depth) const override;
375
377 SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG,
378 UndefPoisonKind Kind, unsigned Depth) const override;
379
381 const APInt &DemandedElts,
382 const SelectionDAG &DAG,
383 UndefPoisonKind Kind,
384 bool ConsiderFlags,
385 unsigned Depth) const override;
386
387 bool isSplatValueForTargetNode(SDValue Op, const APInt &DemandedElts,
388 APInt &UndefElts, const SelectionDAG &DAG,
389 unsigned Depth) const override;
390
392 // Peek through bitcasts/extracts/inserts to see if we have a vector
393 // load/broadcast from memory.
394 while (Op.getOpcode() == ISD::BITCAST ||
395 Op.getOpcode() == ISD::EXTRACT_SUBVECTOR ||
396 (Op.getOpcode() == ISD::INSERT_SUBVECTOR &&
397 Op.getOperand(0).isUndef()))
398 Op = Op.getOperand(Op.getOpcode() == ISD::INSERT_SUBVECTOR ? 1 : 0);
399
400 return Op.getOpcode() == X86ISD::VBROADCAST_LOAD ||
401 Op.getOpcode() == X86ISD::SUBV_BROADCAST_LOAD ||
402 (Op.getOpcode() == ISD::LOAD &&
405 }
406
407 bool isTargetCanonicalSelect(SDNode *N) const override;
408
409 const Constant *getTargetConstantFromLoad(LoadSDNode *LD) const override;
410
411 SDValue unwrapAddress(SDValue N) const override;
412
414
415 ConstraintType getConstraintType(StringRef Constraint) const override;
416
417 /// Examine constraint string and operand type and determine a weight value.
418 /// The operand object must already have been set up with the operand type.
420 getSingleConstraintMatchWeight(AsmOperandInfo &Info,
421 const char *Constraint) const override;
422
423 const char *LowerXConstraint(EVT ConstraintVT) const override;
424
425 /// Lower the specified operand into the Ops vector. If it is invalid, don't
426 /// add anything to Ops. If hasMemory is true it means one of the asm
427 /// constraint of the inline asm instruction being processed is 'm'.
429 std::vector<SDValue> &Ops,
430 SelectionDAG &DAG) const override;
431
433 getInlineAsmMemConstraint(StringRef ConstraintCode) const override {
434 if (ConstraintCode == "v")
436 return TargetLowering::getInlineAsmMemConstraint(ConstraintCode);
437 }
438
439 /// Handle Lowering flag assembly outputs.
441 const SDLoc &DL,
442 const AsmOperandInfo &Constraint,
443 SelectionDAG &DAG) const override;
444
445 /// Given a physical register constraint
446 /// (e.g. {edx}), return the register number and the register class for the
447 /// register. This should only be used for C_Register constraints. On
448 /// error, this returns a register number of 0.
449 std::pair<unsigned, const TargetRegisterClass *>
451 StringRef Constraint, MVT VT) const override;
452
453 /// Return true if the addressing mode represented
454 /// by AM is legal for this target, for a load/store of the specified type.
455 bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM,
456 Type *Ty, unsigned AS,
457 Instruction *I = nullptr) const override;
458
459 bool addressingModeSupportsTLS(const GlobalValue &GV) const override;
460
461 /// Return true if the specified immediate is legal
462 /// icmp immediate, that is the target has icmp instructions which can
463 /// compare a register against the immediate without having to materialize
464 /// the immediate into a register.
465 bool isLegalICmpImmediate(int64_t Imm) const override;
466
467 /// Return true if the specified immediate is legal
468 /// add immediate, that is the target has add instructions which can
469 /// add a register and the immediate without having to materialize
470 /// the immediate into a register.
471 bool isLegalAddImmediate(int64_t Imm) const override;
472
473 bool isLegalStoreImmediate(int64_t Imm) const override;
474
475 /// Add x86-specific opcodes to the default list.
476 bool isBinOp(unsigned Opcode) const override;
477
478 /// Returns true if the opcode is a commutative binary operation.
479 bool isCommutativeBinOp(unsigned Opcode) const override;
480
481 /// Return true if it's free to truncate a value of
482 /// type Ty1 to type Ty2. e.g. On x86 it's free to truncate a i32 value in
483 /// register EAX to i16 by referencing its sub-register AX.
484 bool isTruncateFree(Type *Ty1, Type *Ty2) const override;
485 bool isTruncateFree(EVT VT1, EVT VT2) const override;
486
487 bool allowTruncateForTailCall(Type *Ty1, Type *Ty2) const override;
488
489 /// Return true if any actual instruction that defines a
490 /// value of type Ty1 implicit zero-extends the value to Ty2 in the result
491 /// register. This does not necessarily include registers defined in
492 /// unknown ways, such as incoming arguments, or copies from unknown
493 /// virtual registers. Also, if isTruncateFree(Ty2, Ty1) is true, this
494 /// does not necessarily apply to truncate instructions. e.g. on x86-64,
495 /// all instructions that define 32-bit values implicit zero-extend the
496 /// result out to 64 bits.
497 bool isZExtFree(Type *Ty1, Type *Ty2) const override;
498 bool isZExtFree(EVT VT1, EVT VT2) const override;
499 bool isZExtFree(SDValue Val, EVT VT2) const override;
500
501 bool shouldConvertPhiType(Type *From, Type *To) const override;
502
503 /// Return true if folding a vector load into ExtVal (a sign, zero, or any
504 /// extend node) is profitable.
505 bool isVectorLoadExtDesirable(SDValue) const override;
506
507 /// Return true if an FMA operation is faster than a pair of fmul and fadd
508 /// instructions. fmuladd intrinsics will be expanded to FMAs when this
509 /// method returns true, otherwise fmuladd is expanded to fmul + fadd.
511 EVT VT) const override;
512
513 /// Return true if it's profitable to narrow operations of type SrcVT to
514 /// DestVT. e.g. on x86, it's profitable to narrow from i32 to i8 but not
515 /// from i32 to i16.
516 bool isNarrowingProfitable(SDNode *N, EVT SrcVT, EVT DestVT) const override;
517
518 bool shouldFoldSelectWithIdentityConstant(unsigned BinOpcode, EVT VT,
519 unsigned SelectOpcode, SDValue X,
520 SDValue Y) const override;
521
522 /// Given an intrinsic, checks if on the target the intrinsic will need to
523 /// map to a MemIntrinsicNode (touches memory). If this is the case, it
524 /// returns true and stores the intrinsic information into the IntrinsicInfo
525 /// that was passed to the function.
527 const CallBase &I, MachineFunction &MF,
528 unsigned Intrinsic) const override;
529
530 /// Returns true if the target can instruction select the
531 /// specified FP immediate natively. If false, the legalizer will
532 /// materialize the FP immediate as a load from a constant pool.
533 bool isFPImmLegal(const APFloat &Imm, EVT VT,
534 bool ForCodeSize) const override;
535
536 /// Targets can use this to indicate that they only support *some*
537 /// VECTOR_SHUFFLE operations, those with specific masks. By default, if a
538 /// target supports the VECTOR_SHUFFLE node, all mask values are assumed to
539 /// be legal.
540 bool isShuffleMaskLegal(ArrayRef<int> Mask, EVT VT) const override;
541
542 /// Similar to isShuffleMaskLegal. Targets can use this to indicate if there
543 /// is a suitable VECTOR_SHUFFLE that can be used to replace a VAND with a
544 /// constant pool entry.
545 bool isVectorClearMaskLegal(ArrayRef<int> Mask, EVT VT) const override;
546
547 /// Returns true if lowering to a jump table is allowed.
548 bool areJTsAllowed(const Function *Fn) const override;
549
551 EVT ConditionVT) const override;
552
553 /// If true, then instruction selection should
554 /// seek to shrink the FP constant of the specified type to a smaller type
555 /// in order to save space and / or reduce runtime.
556 bool ShouldShrinkFPConstant(EVT VT) const override;
557
558 /// Return true if we believe it is correct and profitable to reduce the
559 /// load node to a smaller type.
560 bool
562 std::optional<unsigned> ByteOffset) const override;
563
564 /// Return true if the specified scalar FP type is computed in an SSE
565 /// register, not on the X87 floating point stack.
566 bool isScalarFPTypeInSSEReg(EVT VT) const;
567
568 /// Returns true if it is beneficial to convert a load of a constant
569 /// to just the constant itself.
571 Type *Ty) const override;
572
573 bool reduceSelectOfFPConstantLoads(EVT CmpOpVT) const override;
574
575 bool convertSelectOfConstantsToMath(EVT VT) const override;
576
578 EVT CCVT) const override;
579
580 bool decomposeMulByConstant(LLVMContext &Context, EVT VT,
581 SDValue C) const override;
582
583 /// Return the cost of EXTRACT_SUBVECTOR for this result type with this
584 /// index.
586 unsigned Index) const override;
587
588 /// Scalar ops always have equal or better analysis/performance/power than
589 /// the vector equivalent, so this always makes sense if the scalar op is
590 /// supported.
591 bool shouldScalarizeBinop(SDValue) const override;
592
593 /// Extract of a scalar FP value from index 0 of a vector is free.
594 bool isExtractVecEltCheap(EVT VT, unsigned Index) const override {
595 EVT EltVT = VT.getScalarType();
596 return (EltVT == MVT::f32 || EltVT == MVT::f64) && Index == 0;
597 }
598
599 /// Overflow nodes should get combined/lowered to optimal instructions
600 /// (they should allow eliminating explicit compares by getting flags from
601 /// math ops).
602 bool shouldFormOverflowOp(unsigned Opcode, EVT VT,
603 bool MathUsed) const override;
604
605 bool storeOfVectorConstantIsCheap(bool IsZero, EVT MemVT, unsigned NumElem,
606 unsigned AddrSpace) const override {
607 // If we can replace more than 2 scalar stores, there will be a reduction
608 // in instructions even after we add a vector constant load.
609 return IsZero || NumElem > 2;
610 }
611
612 bool isLoadBitCastBeneficial(EVT LoadVT, EVT BitcastVT,
613 const SelectionDAG &DAG,
614 const MachineMemOperand &MMO) const override;
615
616 bool isProfitableToCombineMinNumMaxNum(EVT VT) const override {
617 // X86 has instructions that correspond to cmp + select, so forming
618 // minnum/maxnum is not profitable.
619 return false;
620 }
621
622 Register getRegisterByName(const char* RegName, LLT VT,
623 const MachineFunction &MF) const override;
624
625 /// If a physical register, this returns the register that receives the
626 /// exception address on entry to an EH pad.
629 const Constant *PersonalityFn) const override;
630
631 /// If a physical register, this returns the register that receives the
632 /// exception typeid on entry to a landing pad.
635 const Constant *PersonalityFn) const override;
636
637 bool needsFixedCatchObjects() const override;
638
639 /// This method returns a target specific FastISel object,
640 /// or null if the target does not support "fast" ISel.
641 FastISel *
643 const TargetLibraryInfo *libInfo,
644 const LibcallLoweringInfo *libcallLowering) const override;
645
646 /// If the target has a standard location for the stack protector cookie,
647 /// returns the address of that location. Otherwise, returns nullptr.
649 const LibcallLoweringInfo &Libcalls) const override;
650
651 bool useLoadStackGuardNode(const Module &M) const override;
652 bool useStackGuardMixFP() const override;
653 void
655 const LibcallLoweringInfo &Libcalls) const override;
657 const SDLoc &DL) const override;
658
659 /// Return true if the target stores SafeStack pointer at a fixed offset in
660 /// some non-standard address space, and populates the address space and
661 /// offset as appropriate.
663 IRBuilderBase &IRB, const LibcallLoweringInfo &Libcalls) const override;
664
665 std::pair<SDValue, SDValue> BuildFILD(EVT DstVT, EVT SrcVT, const SDLoc &DL,
666 SDValue Chain, SDValue Pointer,
667 MachinePointerInfo PtrInfo,
668 Align Alignment,
669 SelectionDAG &DAG) const;
670
671 /// Customize the preferred legalization strategy for certain types.
672 LegalizeTypeAction getPreferredVectorAction(MVT VT) const override;
673
675 EVT VT) const override;
676
679 EVT VT) const override;
680
682 LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT,
683 unsigned &NumIntermediates, MVT &RegisterVT) const override;
684
686 Type *Ty, CallingConv::ID CallConv, bool isVarArg,
687 const DataLayout &DL) const override;
688
689 bool isIntDivCheap(EVT VT, AttributeList Attr) const override;
690
691 bool supportSwiftError() const override;
692
693 bool supportKCFIBundles() const override { return true; }
694
697 const TargetInstrInfo *TII) const override;
698
699 bool hasStackProbeSymbol(const MachineFunction &MF) const override;
700 bool hasInlineStackProbe(const MachineFunction &MF) const override;
701 StringRef getStackProbeSymbolName(const MachineFunction &MF) const override;
702
703 unsigned getStackProbeSize(const MachineFunction &MF) const;
704
705 bool hasVectorBlend() const override { return true; }
706
707 unsigned getMaxSupportedInterleaveFactor() const override { return 4; }
708
710 unsigned OpNo) const override;
711
713 MachineMemOperand *MMO, SDValue &NewLoad,
714 SDValue Ptr, SDValue PassThru,
715 SDValue Mask) const override;
717 MachineMemOperand *MMO, SDValue Ptr, SDValue Val,
718 SDValue Mask) const override;
719
720 /// Lower interleaved load(s) into target specific
721 /// instructions/intrinsics.
724 ArrayRef<unsigned> Indices, unsigned Factor,
725 const APInt &GapMask) const override;
726
727 /// Lower interleaved store(s) into target specific
728 /// instructions/intrinsics.
730 ShuffleVectorInst *SVI, unsigned Factor,
731 const APInt &GapMask) const override;
732
734 int JTI, SelectionDAG &DAG) const override;
735
736 Align
738 const MachineBasicBlock *BlockToAlign) const override;
739
740 EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const override {
741 if (VT == MVT::f80)
742 return EVT::getIntegerVT(Context, 96);
744 }
745
746 protected:
747 std::pair<const TargetRegisterClass *, uint8_t>
749 MVT VT) const override;
750
751 private:
752 /// Keep a reference to the X86Subtarget around so that we can
753 /// make the right decision when generating code for different targets.
754 const X86Subtarget &Subtarget;
755
756 /// A list of legal FP immediates.
757 std::vector<APFloat> LegalFPImmediates;
758
759 /// Indicate that this x86 target can instruction
760 /// select the specified FP immediate natively.
761 void addLegalFPImmediate(const APFloat& Imm) {
762 LegalFPImmediates.push_back(Imm);
763 }
764
765 SDValue LowerCallResult(SDValue Chain, SDValue InGlue,
766 CallingConv::ID CallConv, bool isVarArg,
767 const SmallVectorImpl<ISD::InputArg> &Ins,
768 const SDLoc &dl, SelectionDAG &DAG,
769 SmallVectorImpl<SDValue> &InVals,
770 uint32_t *RegMask) const;
771 SDValue LowerMemArgument(SDValue Chain, CallingConv::ID CallConv,
772 const SmallVectorImpl<ISD::InputArg> &ArgInfo,
773 const SDLoc &dl, SelectionDAG &DAG,
774 const CCValAssign &VA, MachineFrameInfo &MFI,
775 unsigned i) const;
776 SDValue LowerMemOpCallTo(SDValue Chain, SDValue StackPtr, SDValue Arg,
777 const SDLoc &dl, SelectionDAG &DAG,
778 const CCValAssign &VA,
779 ISD::ArgFlagsTy Flags, bool isByval) const;
780
781 // Call lowering helpers.
782
783 /// Check whether the call is eligible for sibling call optimization.
784 bool
785 isEligibleForSiblingCallOpt(TargetLowering::CallLoweringInfo &CLI,
786 CCState &CCInfo,
787 SmallVectorImpl<CCValAssign> &ArgLocs) const;
788 SDValue EmitTailCallLoadRetAddr(SelectionDAG &DAG, SDValue &OutRetAddr,
789 SDValue Chain, bool IsTailCall,
790 bool Is64Bit, int FPDiff,
791 const SDLoc &dl) const;
792
793 unsigned GetAlignedArgumentStackSize(unsigned StackSize,
794 SelectionDAG &DAG) const;
795
796 unsigned getAddressSpace() const;
797
798 SDValue FP_TO_INTHelper(SDValue Op, SelectionDAG &DAG, bool IsSigned,
799 SDValue &Chain) const;
800 SDValue LRINT_LLRINTHelper(SDNode *N, SelectionDAG &DAG) const;
801
802 SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
803 SDValue LowerVSELECT(SDValue Op, SelectionDAG &DAG) const;
804 SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
805 SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
806
807 unsigned getGlobalWrapperKind(const GlobalValue *GV,
808 const unsigned char OpFlags) const;
809 SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
810 SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG) const;
811 SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
812 SDValue LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const;
813 SDValue LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) const;
814
815 /// Creates target global address or external symbol nodes for calls or
816 /// other uses.
817 SDValue LowerGlobalOrExternal(SDValue Op, SelectionDAG &DAG, bool ForCall,
818 bool *IsImpCall) const;
819
820 SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
821 SDValue LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
822 SDValue LowerTRUNCATE(SDValue Op, SelectionDAG &DAG) const;
823 SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
824 SDValue LowerFP_TO_INT_SAT(SDValue Op, SelectionDAG &DAG) const;
825 SDValue LowerLRINT_LLRINT(SDValue Op, SelectionDAG &DAG) const;
826 SDValue LowerSETCC(SDValue Op, SelectionDAG &DAG) const;
827 SDValue LowerSETCCCARRY(SDValue Op, SelectionDAG &DAG) const;
828 SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
829 SDValue LowerConditionalBranch(SDValue Op, SelectionDAG &DAG) const;
830 SDValue LowerJumpTable(SDValue Op, SelectionDAG &DAG) const;
831 SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
832 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
833 SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const;
834 SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
835 SDValue LowerADDROFRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
836 SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
837 SDValue LowerFRAME_TO_ARGS_OFFSET(SDValue Op, SelectionDAG &DAG) const;
838 ByValCopyKind ByValNeedsCopyForTailCall(SelectionDAG &DAG, SDValue Src,
839 SDValue Dst,
840 ISD::ArgFlagsTy Flags) const;
841 SDValue LowerEH_RETURN(SDValue Op, SelectionDAG &DAG) const;
842 SDValue lowerEH_SJLJ_SETJMP(SDValue Op, SelectionDAG &DAG) const;
843 SDValue lowerEH_SJLJ_LONGJMP(SDValue Op, SelectionDAG &DAG) const;
844 SDValue lowerEH_SJLJ_SETUP_DISPATCH(SDValue Op, SelectionDAG &DAG) const;
845 SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
846 SDValue LowerGET_ROUNDING(SDValue Op, SelectionDAG &DAG) const;
847 SDValue LowerSET_ROUNDING(SDValue Op, SelectionDAG &DAG) const;
848 SDValue LowerGET_FPENV_MEM(SDValue Op, SelectionDAG &DAG) const;
849 SDValue LowerSET_FPENV_MEM(SDValue Op, SelectionDAG &DAG) const;
850 SDValue LowerRESET_FPENV(SDValue Op, SelectionDAG &DAG) const;
851 SDValue LowerWin64_i128OP(SDValue Op, SelectionDAG &DAG) const;
852 SDValue LowerWin64_FP_TO_INT128(SDValue Op, SelectionDAG &DAG,
853 SDValue &Chain) const;
854 SDValue LowerWin64_INT128_TO_FP(SDValue Op, SelectionDAG &DAG) const;
855 SDValue LowerGC_TRANSITION(SDValue Op, SelectionDAG &DAG) const;
856 SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
857 SDValue lowerFaddFsub(SDValue Op, SelectionDAG &DAG) const;
858 SDValue LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const;
859 SDValue LowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const;
860 SDValue LowerBF16_TO_FP(SDValue Op, SelectionDAG &DAG) const;
861 SDValue LowerFP_TO_BF16(SDValue Op, SelectionDAG &DAG) const;
862
863 SDValue
864 LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
865 const SmallVectorImpl<ISD::InputArg> &Ins,
866 const SDLoc &dl, SelectionDAG &DAG,
867 SmallVectorImpl<SDValue> &InVals) const override;
868 SDValue LowerCall(CallLoweringInfo &CLI,
869 SmallVectorImpl<SDValue> &InVals) const override;
870
871 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
872 const SmallVectorImpl<ISD::OutputArg> &Outs,
873 const SmallVectorImpl<SDValue> &OutVals,
874 const SDLoc &dl, SelectionDAG &DAG) const override;
875
876 bool supportSplitCSR(MachineFunction *MF) const override {
877 return MF->getFunction().getCallingConv() == CallingConv::CXX_FAST_TLS &&
878 MF->getFunction().hasFnAttribute(Attribute::NoUnwind);
879 }
880 void initializeSplitCSR(MachineBasicBlock *Entry) const override;
881 void insertCopiesSplitCSR(
882 MachineBasicBlock *Entry,
883 const SmallVectorImpl<MachineBasicBlock *> &Exits) const override;
884
885 bool isUsedByReturnOnly(SDNode *N, SDValue &Chain) const override;
886
887 bool mayBeEmittedAsTailCall(const CallInst *CI) const override;
888
889 EVT getTypeForExtReturn(LLVMContext &Context, EVT VT,
890 ISD::NodeType ExtendKind) const override;
891
892 bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF,
893 bool isVarArg,
894 const SmallVectorImpl<ISD::OutputArg> &Outs,
895 LLVMContext &Context,
896 const Type *RetTy) const override;
897
898 const MCPhysReg *getScratchRegisters(CallingConv::ID CC) const override;
900
902 shouldExpandAtomicLoadInIR(LoadInst *LI) const override;
903
905 shouldExpandAtomicStoreInIR(StoreInst *SI) const override;
907 shouldExpandAtomicRMWInIR(const AtomicRMWInst *AI) const override;
909 shouldExpandLogicAtomicRMWInIR(const AtomicRMWInst *AI) const;
910 void emitBitTestAtomicRMWIntrinsic(AtomicRMWInst *AI) const override;
911 void emitCmpArithAtomicRMWIntrinsic(AtomicRMWInst *AI) const override;
912
913 LoadInst *
914 lowerIdempotentRMWIntoFencedLoad(AtomicRMWInst *AI) const override;
915
916 bool shouldIssueAtomicLoadForAtomicEmulationLoop() const override {
917 return false;
918 }
919
920 bool needsCmpXchgNb(Type *MemType) const;
921
922 void SetupEntryBlockForSjLj(MachineInstr &MI, MachineBasicBlock *MBB,
923 MachineBasicBlock *DispatchBB, int FI) const;
924
925 // Utility function to emit the low-level va_arg code for X86-64.
926 MachineBasicBlock *
927 EmitVAARGWithCustomInserter(MachineInstr &MI, MachineBasicBlock *MBB) const;
928
929 /// Utility function to emit the xmm reg save portion of va_start.
930 MachineBasicBlock *EmitLoweredCascadedSelect(MachineInstr &MI1,
931 MachineInstr &MI2,
932 MachineBasicBlock *BB) const;
933
934 MachineBasicBlock *EmitLoweredSelect(MachineInstr &I,
935 MachineBasicBlock *BB) const;
936
937 MachineBasicBlock *EmitLoweredCatchRet(MachineInstr &MI,
938 MachineBasicBlock *BB) const;
939
940 MachineBasicBlock *EmitLoweredSegAlloca(MachineInstr &MI,
941 MachineBasicBlock *BB) const;
942
943 MachineBasicBlock *EmitLoweredProbedAlloca(MachineInstr &MI,
944 MachineBasicBlock *BB) const;
945
946 MachineBasicBlock *EmitLoweredTLSCall(MachineInstr &MI,
947 MachineBasicBlock *BB) const;
948
949 MachineBasicBlock *EmitLoweredIndirectThunk(MachineInstr &MI,
950 MachineBasicBlock *BB) const;
951
952 MachineBasicBlock *emitEHSjLjSetJmp(MachineInstr &MI,
953 MachineBasicBlock *MBB) const;
954
955 void emitSetJmpShadowStackFix(MachineInstr &MI,
956 MachineBasicBlock *MBB) const;
957
958 MachineBasicBlock *emitEHSjLjLongJmp(MachineInstr &MI,
959 MachineBasicBlock *MBB) const;
960
961 MachineBasicBlock *emitLongJmpShadowStackFix(MachineInstr &MI,
962 MachineBasicBlock *MBB) const;
963
964 MachineBasicBlock *EmitSjLjDispatchBlock(MachineInstr &MI,
965 MachineBasicBlock *MBB) const;
966
967 MachineBasicBlock *emitPatchableEventCall(MachineInstr &MI,
968 MachineBasicBlock *MBB) const;
969
970 /// Emit flags for the given setcc condition and operands. Also returns the
971 /// corresponding X86 condition code constant in X86CC.
972 SDValue emitFlagsForSetcc(SDValue Op0, SDValue Op1, ISD::CondCode CC,
973 const SDLoc &dl, SelectionDAG &DAG,
974 SDValue &X86CC) const;
975
976 bool optimizeFMulOrFDivAsShiftAddBitcast(SDNode *N, SDValue FPConst,
977 SDValue IntPow2) const override;
978
979 /// Check if replacement of SQRT with RSQRT should be disabled.
980 bool isFsqrtCheap(SDValue Op, SelectionDAG &DAG) const override;
981
982 /// Use rsqrt* to speed up sqrt calculations.
983 SDValue getSqrtEstimate(SDValue Op, SelectionDAG &DAG, int Enabled,
984 int &RefinementSteps, bool &UseOneConstNR,
985 bool Reciprocal) const override;
986
987 /// Use rcp* to speed up fdiv calculations.
988 SDValue getRecipEstimate(SDValue Op, SelectionDAG &DAG, int Enabled,
989 int &RefinementSteps) const override;
990
991 /// Reassociate floating point divisions into multiply by reciprocal.
992 unsigned combineRepeatedFPDivisors() const override;
993
994 SDValue BuildSDIVPow2(SDNode *N, const APInt &Divisor, SelectionDAG &DAG,
995 SmallVectorImpl<SDNode *> &Created) const override;
996
997 SDValue getMOVL(SelectionDAG &DAG, const SDLoc &dl, MVT VT, SDValue V1,
998 SDValue V2) const;
999 };
1000
1001 namespace X86 {
1002 FastISel *createFastISel(FunctionLoweringInfo &funcInfo,
1003 const TargetLibraryInfo *libInfo,
1004 const LibcallLoweringInfo *libcallLowering);
1005 } // end namespace X86
1006
1007 // X86 specific Gather/Scatter nodes.
1008 // The class has the same order of operands as MaskedGatherScatterSDNode for
1009 // convenience.
1011 public:
1012 // This is a intended as a utility and should never be directly created.
1015
1016 const SDValue &getBasePtr() const { return getOperand(3); }
1017 const SDValue &getIndex() const { return getOperand(4); }
1018 const SDValue &getMask() const { return getOperand(2); }
1019 const SDValue &getScale() const { return getOperand(5); }
1020
1021 static bool classof(const SDNode *N) {
1022 return N->getOpcode() == X86ISD::MGATHER ||
1023 N->getOpcode() == X86ISD::MSCATTER;
1024 }
1025 };
1026
1028 public:
1029 const SDValue &getPassThru() const { return getOperand(1); }
1030
1031 static bool classof(const SDNode *N) {
1032 return N->getOpcode() == X86ISD::MGATHER;
1033 }
1034 };
1035
1037 public:
1038 const SDValue &getValue() const { return getOperand(1); }
1039
1040 static bool classof(const SDNode *N) {
1041 return N->getOpcode() == X86ISD::MSCATTER;
1042 }
1043 };
1044
1045 /// Generate unpacklo/unpackhi shuffle mask.
1046 void createUnpackShuffleMask(EVT VT, SmallVectorImpl<int> &Mask, bool Lo,
1047 bool Unary);
1048
1049 /// Similar to unpacklo/unpackhi, but without the 128-bit lane limitation
1050 /// imposed by AVX and specific to the unary pattern. Example:
1051 /// v8iX Lo --> <0, 0, 1, 1, 2, 2, 3, 3>
1052 /// v8iX Hi --> <4, 4, 5, 5, 6, 6, 7, 7>
1053 void createSplat2ShuffleMask(MVT VT, SmallVectorImpl<int> &Mask, bool Lo);
1054
1055} // end namespace llvm
1056
1057#endif // LLVM_LIB_TARGET_X86_X86ISELLOWERING_H
unsigned Imm
static SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG)
static SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG, const ARMSubtarget *ST)
static SDValue LowerFP_TO_INT_SAT(SDValue Op, SelectionDAG &DAG, const ARMSubtarget *Subtarget)
static SDValue LowerSETCCCARRY(SDValue Op, SelectionDAG &DAG)
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
Function Alias Analysis Results
#define X(NUM, ENUM, NAME)
Definition ELF.h:857
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
const HexagonInstrInfo * TII
IRTranslator LLVM IR MI
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define RegName(no)
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Register const TargetRegisterInfo * TRI
static unsigned getAddressSpace(const Value *V, unsigned MaxLookup)
static void LowerMemOpCallTo(SelectionDAG &DAG, MachineFunction &MF, SDValue Chain, SDValue Arg, SDValue PtrOff, int SPDiff, unsigned ArgOffset, bool isPPC64, bool isTailCall, bool isVector, SmallVectorImpl< SDValue > &MemOpChains, SmallVectorImpl< TailCallArgumentInfo > &TailCallArguments, const SDLoc &dl)
LowerMemOpCallTo - Store the argument to the stack or remember it in case of tail calls.
const SmallVectorImpl< MachineOperand > & Cond
static SDValue LowerUINT_TO_FP(SDValue Op, SelectionDAG &DAG, const SparcTargetLowering &TLI, bool hasHardQuad)
static SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG, const SparcSubtarget *Subtarget)
static SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG, const SparcSubtarget *Subtarget)
static SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG)
static SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG, const SparcTargetLowering &TLI, const SparcSubtarget *Subtarget)
static SDValue LowerSINT_TO_FP(SDValue Op, SelectionDAG &DAG, const SparcTargetLowering &TLI, bool hasHardQuad)
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
This file describes how to lower LLVM code to machine code.
static bool is64Bit(const char *name)
static SDValue LowerCallResult(SDValue Chain, SDValue InGlue, const SmallVectorImpl< CCValAssign > &RVLocs, const SDLoc &dl, SelectionDAG &DAG, SmallVectorImpl< SDValue > &InVals)
LowerCallResult - Lower the result values of a call into the appropriate copies out of appropriate ph...
Class for arbitrary precision integers.
Definition APInt.h:78
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
This is an important base class in LLVM.
Definition Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
This is a fast-path instruction selection class that generates poor code and doesn't support illegal ...
Definition FastISel.h:67
FunctionLoweringInfo - This contains information that is global to a function that is used when lower...
Common base class shared among various IRBuilders.
Definition IRBuilder.h:114
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Tracks which library functions to use for a particular subtarget or function.
This class is used to represent ISD::LOAD nodes.
Context object for machine code objects.
Definition MCContext.h:83
Base class for the full range of assembler expressions which are needed for parsing.
Definition MCExpr.h:34
Machine Value Type.
static MVT getIntegerVT(unsigned BitWidth)
Instructions::iterator instr_iterator
Representation of each machine instruction.
A description of a memory reference used in the backend.
unsigned getAddrSpace() const
Flags
Flags values. These may be or'd together.
Flags getFlags() const
Return the raw flags of the source value,.
LLVM_ABI Align getAlign() const
Return the minimum known alignment in bytes of the actual memory reference.
MemIntrinsicSDNode(unsigned Opc, unsigned Order, const DebugLoc &dl, SDVTList VTs, EVT MemoryVT, PointerUnion< MachineMemOperand *, MachineMemOperand ** > MemRefs)
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
Wrapper class representing virtual and physical registers.
Definition Register.h:20
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
const SDValue & getOperand(unsigned Num) const
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...
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...
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
TargetInstrInfo - Interface to description of machine instruction set.
Provides information about what library functions are available for the current target.
ShiftLegalizationStrategy
Return the preferred strategy to legalize tihs SHIFT instruction, with ExpansionFactor being the recu...
virtual EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const
For types supported by the target, this is an identity function.
ExtractSubvectorCost
Enum that specifies how expensive lowering an EXTRACT_SUBVECTOR is.
bool isOperationLegalOrCustom(unsigned Op, EVT VT, bool LegalOnly=false) const
Return true if the specified operation is legal on this target or can be made legal with custom lower...
virtual bool shouldIssueAtomicLoadForAtomicEmulationLoop(void) const
AtomicExpansionKind
Enum that specifies what an atomic load/AtomicRMWInst is expanded to, if at all.
AndOrSETCCFoldKind
Enum of different potentially desirable ways to fold (and/or (setcc ...), (setcc ....
NegatibleCost
Enum that specifies when a float negation is beneficial.
std::vector< ArgListEntry > ArgListTy
virtual InlineAsm::ConstraintCode getInlineAsmMemConstraint(StringRef ConstraintCode) const
virtual bool isTargetCanonicalConstantNode(SDValue Op) const
Returns true if the given Opc is considered a canonical constant for the target, which should not be ...
TargetLowering(const TargetLowering &)=delete
virtual ArrayRef< MCPhysReg > getRoundingControlRegisters() const
Returns a 0 terminated array of rounding control registers that can be attached into strict FP call.
virtual unsigned combineRepeatedFPDivisors() const
Indicate whether this target prefers to combine FDIVs with the same divisor.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
LLVM Value Representation.
Definition Value.h:75
const SDValue & getPassThru() const
static bool classof(const SDNode *N)
static bool classof(const SDNode *N)
const SDValue & getValue() const
static bool classof(const SDNode *N)
bool shouldFormOverflowOp(unsigned Opcode, EVT VT, bool MathUsed) const override
Overflow nodes should get combined/lowered to optimal instructions (they should allow eliminating exp...
bool useStackGuardMixFP() const override
If this function returns true, stack protection checks should mix the frame pointer (or whichever poi...
std::pair< const TargetRegisterClass *, uint8_t > findRepresentativeClass(const TargetRegisterInfo *TRI, MVT VT) const override
Return the largest legal super-reg register class of the register class for the specified type and it...
bool isLegalAddImmediate(int64_t Imm) const override
Return true if the specified immediate is legal add immediate, that is the target has add instruction...
bool preferSextInRegOfTruncate(EVT TruncVT, EVT VT, EVT ExtVT) const override
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...
SDValue getPICJumpTableRelocBase(SDValue Table, SelectionDAG &DAG) const override
Returns relocation base for the given PIC jumptable.
bool preferABDSToABSWithNSW(EVT VT) const override
bool isCheapToSpeculateCtlz(Type *Ty) const override
Return true if it is cheap to speculate a call to intrinsic ctlz.
ExtractSubvectorCost getExtractSubvectorCost(EVT ResVT, EVT SrcVT, unsigned Index) const override
Return the cost of EXTRACT_SUBVECTOR for this result type with this index.
bool isMultiStoresCheaperThanBitsMerge(EVT LTy, EVT HTy) const override
Return true if it is cheaper to split the store of a merged int val from a pair of smaller values int...
unsigned getJumpTableEncoding() const override
Return the entry encoding for a jump table in the current function.
std::pair< SDValue, SDValue > BuildFILD(EVT DstVT, EVT SrcVT, const SDLoc &DL, SDValue Chain, SDValue Pointer, MachinePointerInfo PtrInfo, Align Alignment, SelectionDAG &DAG) const
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 SimplifyDemandedVectorEltsForTargetNode(SDValue Op, const APInt &DemandedElts, APInt &KnownUndef, APInt &KnownZero, TargetLoweringOpt &TLO, unsigned Depth) const override
Attempt to simplify any target nodes based on the demanded vector elements, returning true on success...
bool isMemoryAccessFast(EVT VT, Align Alignment) const
SDValue LowerAsmOutputForConstraint(SDValue &Chain, SDValue &Flag, const SDLoc &DL, const AsmOperandInfo &Constraint, SelectionDAG &DAG) const override
Handle Lowering flag assembly outputs.
CondMergingParams getJumpConditionMergingParams(Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs, const Function *F) const override
bool supportKCFIBundles() const override
Return true if the target supports kcfi operand bundles.
const char * LowerXConstraint(EVT ConstraintVT) const override
Try to replace an X constraint, which matches anything, with another that has more specific requireme...
SDValue SimplifyMultipleUseDemandedBitsForTargetNode(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, SelectionDAG &DAG, unsigned Depth) const override
More limited version of SimplifyDemandedBits that can be used to "lookthrough" ops that don't contrib...
bool useLoadStackGuardNode(const Module &M) const override
If this function returns true, SelectionDAGBuilder emits a LOAD_STACK_GUARD node when it is lowering ...
bool isSplatValueForTargetNode(SDValue Op, const APInt &DemandedElts, APInt &UndefElts, const SelectionDAG &DAG, unsigned Depth) const override
Return true if vector Op has the same value across all DemandedElts, indicating any elements which ma...
bool convertSelectOfConstantsToMath(EVT VT) const override
Return true if a select of constants (select Cond, C1, C2) should be transformed into simple math ops...
ConstraintType getConstraintType(StringRef Constraint) const override
Given a constraint letter, return the type of constraint for this target.
bool hasVectorBlend() const override
Return true if the target has a vector blend instruction.
Value * getIRStackGuard(IRBuilderBase &IRB, const LibcallLoweringInfo &Libcalls) const override
If the target has a standard location for the stack protector cookie, returns the address of that loc...
bool useSoftFloat() const override
InlineAsm::ConstraintCode getInlineAsmMemConstraint(StringRef ConstraintCode) const override
ShiftLegalizationStrategy preferredShiftLegalizationStrategy(SelectionDAG &DAG, SDNode *N, unsigned ExpansionFactor) const override
SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override
Provide custom lowering hooks for some operations.
bool isLegalStoreImmediate(int64_t Imm) const override
Return true if the specified immediate is legal for the value input of a store instruction.
SDValue visitMaskedStore(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, MachineMemOperand *MMO, SDValue Ptr, SDValue Val, SDValue Mask) const override
SDValue getNegatedExpression(SDValue Op, SelectionDAG &DAG, bool LegalOperations, bool ForCodeSize, NegatibleCost &Cost, unsigned Depth) const override
Return the newly negated expression if the cost is not expensive and set the cost in Cost to indicate...
Value * getSafeStackPointerLocation(IRBuilderBase &IRB, const LibcallLoweringInfo &Libcalls) const override
Return true if the target stores SafeStack pointer at a fixed offset in some non-standard address spa...
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...
const MCExpr * getPICJumpTableRelocBaseExpr(const MachineFunction *MF, unsigned JTI, MCContext &Ctx) const override
This returns the relocation base for the given PIC jumptable, the same as getPICJumpTableRelocBase,...
bool isCtlzFast() const override
Return true if ctlz instruction is fast.
Register getRegisterByName(const char *RegName, LLT VT, const MachineFunction &MF) const override
Return the register ID of the name passed in.
bool isSafeMemOpType(MVT VT) const override
Returns true if it's safe to use load / store of the specified type to expand memcpy / memset inline.
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>>...
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,...
MVT getScalarShiftAmountTy(const DataLayout &, EVT VT) const override
Return the type to use for a scalar shift opcode, given the shifted amount type.
bool supportSwiftError() const override
Return true if the target supports swifterror attribute.
bool storeOfVectorConstantIsCheap(bool IsZero, EVT MemVT, unsigned NumElem, unsigned AddrSpace) const override
Return true if it is expected to be cheaper to do a store of vector constant with the given size and ...
Align getByValTypeAlignment(Type *Ty, const DataLayout &DL) const override
Return the desired alignment for ByVal aggregate function arguments in the caller parameter area.
bool isCheapToSpeculateCttz(Type *Ty) const override
Return true if it is cheap to speculate a call to intrinsic cttz.
bool shouldSplatInsEltVarIndex(EVT VT) const override
Return true if inserting a scalar into a variable element of an undef vector is more efficiently hand...
bool isInlineAsmTargetBranch(const SmallVectorImpl< StringRef > &AsmStrs, unsigned OpNo) const override
On x86, return true if the operand with index OpNo is a CALL or JUMP instruction, which can use eithe...
MVT hasFastEqualityCompare(unsigned NumBits) const override
Vector-sized comparisons are fast using PCMPEQ + PMOVMSK or PTEST.
bool SimplifyDemandedVectorEltsForTargetShuffle(SDValue Op, const APInt &DemandedElts, unsigned MaskIndex, TargetLoweringOpt &TLO, unsigned Depth) const
bool isLegalICmpImmediate(int64_t Imm) const override
Return true if the specified immediate is legal icmp immediate, that is the target has icmp instructi...
bool hasInlineStackProbe(const MachineFunction &MF) const override
Returns true if stack probing through inline assembly is requested.
MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr &MI, MachineBasicBlock *MBB) const override
This method should be implemented by targets that mark instructions with the 'usesCustomInserter' fla...
unsigned preferedOpcodeForCmpEqPiecesOfOperand(EVT VT, unsigned ShiftOpc, bool MayTransformRotate, const APInt &ShiftOrRotateAmt, const std::optional< APInt > &AndMask) const override
bool isXAndYEqZeroPreferableToXAndYEqY(ISD::CondCode Cond, EVT VT) const override
bool canMergeStoresTo(unsigned AddressSpace, EVT MemVT, const MachineFunction &MF) const override
Returns if it's reasonable to merge stores to MemVT size.
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...
bool SimplifyDemandedBitsForTargetNode(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, KnownBits &Known, TargetLoweringOpt &TLO, unsigned Depth) const override
Attempt to simplify any target nodes based on the demanded bits/elts, returning true on success.
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 shouldReduceLoadWidth(SDNode *Load, ISD::LoadExtType ExtTy, EVT NewVT, std::optional< unsigned > ByteOffset) const override
Return true if we believe it is correct and profitable to reduce the load node to a smaller type.
bool allowsMemoryAccess(LLVMContext &Context, const DataLayout &DL, EVT VT, const MachineMemOperand &MMO, unsigned *Fast) const
bool preferScalarizeSplat(SDNode *N) const override
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.
std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const override
Given a physical register constraint (e.g.
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 canCreateUndefOrPoisonForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, UndefPoisonKind Kind, bool ConsiderFlags, unsigned Depth) const override
Return true if Op can create undef or poison from non-undef & non-poison operands.
bool lowerInterleavedStore(Instruction *Store, Value *Mask, ShuffleVectorInst *SVI, unsigned Factor, const APInt &GapMask) const override
Lower interleaved store(s) into target specific instructions/intrinsics.
bool shouldNormalizeToSelectSequence(LLVMContext &Context, EVT VT, EVT CCVT) const override
Returns true if we should normalize select(N0&N1, X, Y) => select(N0, select(N1, X,...
bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS, Align Alignment, MachineMemOperand::Flags Flags, unsigned *Fast) const override
Returns true if the target allows unaligned memory accesses of the specified type.
unsigned getPreferredShrunkVectorSizeInBits(SDValue Op, const APInt &DemandedElts) const override
If only low elements of a vector are demanded, shrink the operation to the returned size in bits by c...
bool isNarrowingProfitable(SDNode *N, EVT SrcVT, EVT DestVT) const override
Return true if it's profitable to narrow operations of type SrcVT to DestVT.
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 isProfitableToCombineMinNumMaxNum(EVT VT) const override
MachineInstr * EmitKCFICheck(MachineBasicBlock &MBB, MachineBasicBlock::instr_iterator &MBBI, const TargetInstrInfo *TII) const override
bool preferZeroCompareBranch() const override
Return true if the heuristic to prefer icmp eq zero should be used in code gen prepare.
bool isLoadBitCastBeneficial(EVT LoadVT, EVT BitcastVT, const SelectionDAG &DAG, const MachineMemOperand &MMO) const override
Return true if the following transform is beneficial: fold (conv (load x)) -> (load (conv*)x) On arch...
unsigned getMaxSupportedInterleaveFactor() const override
Get the maximum supported factor for interleaved memory accesses.
bool lowerInterleavedLoad(Instruction *Load, Value *Mask, ArrayRef< ShuffleVectorInst * > Shuffles, ArrayRef< unsigned > Indices, unsigned Factor, const APInt &GapMask) const override
Lower interleaved load(s) into target specific instructions/intrinsics.
bool hasAndNotCompare(SDValue Y) const override
Return true if the target should transform: (X & Y) == Y ---> (~X & Y) == 0 (X & Y) !...
bool reduceSelectOfFPConstantLoads(EVT CmpOpVT) const override
Return true if it is profitable to convert a select of FP constants into a constant pool load whose a...
EVT getOptimalMemOpType(LLVMContext &Context, const MemOp &Op, const AttributeList &FuncAttributes) const override
It returns EVT::Other if the type should be determined using generic target-independent logic.
StringRef getStackProbeSymbolName(const MachineFunction &MF) const override
Returns the name of the symbol used to emit stack probes or the empty string if not applicable.
bool hasBitTest(SDValue X, SDValue Y) const override
Return true if the target has a bit-test instruction: (X & (1 << Y)) ==/!= 0 This knowledge can be us...
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...
bool allowTruncateForTailCall(Type *Ty1, Type *Ty2) const override
Return true if a truncation from FromTy to ToTy is permitted when deciding whether a call is in tail ...
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...
bool isShuffleMaskLegal(ArrayRef< int > Mask, EVT VT) const override
Targets can use this to indicate that they only support some VECTOR_SHUFFLE operations,...
unsigned ComputeNumSignBitsForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, unsigned Depth) const override
Determine the number of bits in the operation that are sign bits.
bool shouldScalarizeBinop(SDValue) const override
Scalar ops always have equal or better analysis/performance/power than the vector equivalent,...
void markLibCallAttributes(MachineFunction *MF, unsigned CC, ArgListTy &Args) const override
void insertSSPDeclarations(Module &M, const LibcallLoweringInfo &Libcalls) const override
Inserts necessary declarations for SSP (stack protection) purpose.
bool isTruncateFree(Type *Ty1, Type *Ty2) const override
Return true if it's free to truncate a value of type Ty1 to type Ty2.
bool shouldFoldConstantShiftPairToMask(const SDNode *N) const override
Return true if it is profitable to fold a pair of shifts into a mask.
bool decomposeMulByConstant(LLVMContext &Context, EVT VT, SDValue C) const override
Return true if it is profitable to transform an integer multiplication-by-constant into simpler opera...
bool areJTsAllowed(const Function *Fn) const override
Returns true if lowering to a jump table is allowed.
Register getExceptionSelectorRegister(ExceptionHandling EH, const Constant *PersonalityFn) const override
If a physical register, this returns the register that receives the exception typeid on entry to a la...
bool isCommutativeBinOp(unsigned Opcode) const override
Returns true if the opcode is a commutative binary operation.
bool isScalarFPTypeInSSEReg(EVT VT) const
Return true if the specified scalar FP type is computed in an SSE register, not on the X87 floating p...
MVT getPreferredSwitchConditionType(LLVMContext &Context, EVT ConditionVT) const override
Returns preferred type for switch condition.
SDValue visitMaskedLoad(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, MachineMemOperand *MMO, SDValue &NewLoad, SDValue Ptr, SDValue PassThru, SDValue Mask) const override
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.
unsigned getNumRegistersForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const override
Certain targets require unusual breakdowns of certain types.
bool convertSetCCLogicToBitwiseLogic(EVT VT) const override
Use bitwise logic to make pairs of compares more efficient.
bool isVectorClearMaskLegal(ArrayRef< int > Mask, EVT VT) const override
Similar to isShuffleMaskLegal.
ConstraintWeight getSingleConstraintMatchWeight(AsmOperandInfo &Info, const char *Constraint) const override
Examine constraint string and operand type and determine a weight value.
bool isIntDivCheap(EVT VT, AttributeList Attr) const override
Return true if integer divide is usually cheaper than a sequence of several shifts,...
LegalizeTypeAction getPreferredVectorAction(MVT VT) const override
Customize the preferred legalization strategy for certain types.
bool shouldConvertPhiType(Type *From, Type *To) const override
Given a set in interconnected phis of type 'From' that are loaded/stored or bitcast to type 'To',...
bool hasStackProbeSymbol(const MachineFunction &MF) const override
Returns true if stack probing through a function call is requested.
bool isZExtFree(Type *Ty1, Type *Ty2) const override
Return true if any actual instruction that defines a value of type Ty1 implicit zero-extends the valu...
bool allowsMemoryAccess(LLVMContext &Context, const DataLayout &DL, EVT VT, unsigned AddrSpace, Align Alignment, MachineMemOperand::Flags Flags=MachineMemOperand::MONone, unsigned *Fast=nullptr) const override
This function returns true if the memory access is aligned or if the target allows this specific unal...
Register getExceptionPointerRegister(ExceptionHandling EH, const Constant *PersonalityFn) const override
If a physical register, this returns the register that receives the exception address on entry to an ...
bool isTargetCanonicalConstantNode(SDValue Op) const override
Returns true if the given Opc is considered a canonical constant for the target, which should not be ...
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...
Align getPrefLoopAlignment(MachineLoop *ML, const MachineBasicBlock *BlockToAlign) const override
Return the preferred loop alignment.
bool mergeStoresAfterLegalization(EVT MemVT) const override
Do not merge vector stores after legalization because that may conflict with x86-specific store split...
TargetLowering::AndOrSETCCFoldKind isDesirableToCombineLogicOpOfSETCC(const SDNode *LogicOp, const SDNode *SETCC0, const SDNode *SETCC1) const override
Return prefered fold type, Abs if this is a vector, AddAnd if its an integer, None otherwise.
bool shouldFoldMaskToVariableShiftPair(SDValue Y) const override
There are two ways to clear extreme bits (either low or high): Mask: x & (-1 << y) (the instcombine c...
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 addressingModeSupportsTLS(const GlobalValue &GV) const override
Returns true if the targets addressing mode can target thread local storage (TLS).
SDValue getReturnAddressFrameIndex(SelectionDAG &DAG) const
bool targetShrinkDemandedConstant(SDValue Op, const APInt &DemandedBits, const APInt &DemandedElts, TargetLoweringOpt &TLO) const override
void getTgtMemIntrinsic(SmallVectorImpl< IntrinsicInfo > &Infos, const CallBase &I, MachineFunction &MF, unsigned Intrinsic) const override
Given an intrinsic, checks if on the target the intrinsic will need to map to a MemIntrinsicNode (tou...
SDValue expandIndirectJTBranch(const SDLoc &dl, SDValue Value, SDValue Addr, int JTI, SelectionDAG &DAG) const override
Expands target specific indirect branch for the case of JumpTable expansion.
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 isBinOp(unsigned Opcode) const override
Add x86-specific opcodes to the default list.
bool IsDesirableToPromoteOp(SDValue Op, EVT &PVT) const override
Return true if the target has native support for the specified value type and it is 'desirable' to us...
SDValue unwrapAddress(SDValue N) const override
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Context, EVT VT) const override
Return the value type to use for ISD::SETCC.
X86TargetLowering(const X86TargetMachine &TM, const X86Subtarget &STI)
bool isTargetCanonicalSelect(SDNode *N) const override
Return true if the given select/vselect should be considered canonical and not be transformed.
bool isVectorLoadExtDesirable(SDValue) const override
Return true if folding a vector load into ExtVal (a sign, zero, or any extend node) is profitable.
FastISel * createFastISel(FunctionLoweringInfo &funcInfo, const TargetLibraryInfo *libInfo, const LibcallLoweringInfo *libcallLowering) const override
This method returns a target specific FastISel object, or null if the target does not support "fast" ...
const Constant * getTargetConstantFromLoad(LoadSDNode *LD) const override
This method returns the constant pool value that will be loaded by LD.
EVT getTypeToTransformTo(LLVMContext &Context, EVT VT) const override
For types supported by the target, this is an identity function.
const MCExpr * LowerCustomJumpTableEntry(const MachineJumpTableInfo *MJTI, const MachineBasicBlock *MBB, unsigned uid, MCContext &Ctx) const override
unsigned getStackProbeSize(const MachineFunction &MF) const
bool ShouldShrinkFPConstant(EVT VT) const override
If true, then instruction selection should seek to shrink the FP constant of the specified type to a ...
void ReplaceNodeResults(SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG) const override
Replace the results of node with an illegal result type with new values built out of custom code.
bool isMaskAndCmp0FoldingBeneficial(const Instruction &AndI) const override
Return if the target supports combining a chain like:
void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint, std::vector< SDValue > &Ops, SelectionDAG &DAG) const override
Lower the specified operand into the Ops vector.
bool isGuaranteedNotToBeUndefOrPoisonForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, UndefPoisonKind Kind, unsigned Depth) const override
Return true if this function can prove that Op is never poison and, Kind can be used to track poison ...
SDValue emitStackGuardMixFP(SelectionDAG &DAG, SDValue Val, const SDLoc &DL) const override
bool needsFixedCatchObjects() const override
bool isExtractVecEltCheap(EVT VT, unsigned Index) const override
Extract of a scalar FP value from index 0 of a vector is free.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ CXX_FAST_TLS
Used for access functions.
Definition CallingConv.h:72
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:43
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
Definition ISDOpcodes.h:605
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
Definition ISDOpcodes.h:619
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
LoadExtType
LoadExtType enum - This enum defines the three variants of LOADEXT (load with extension).
This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM.
Define some predicates that are used for node matching.
RoundingMode
Current rounding mode is represented in bits 11:10 of FPSR.
FastISel * createFastISel(FunctionLoweringInfo &funcInfo, const TargetLibraryInfo *libInfo, const LibcallLoweringInfo *libcallLowering)
bool mayFoldLoadIntoBroadcastFromMem(SDValue Op, MVT EltVT, const X86Subtarget &Subtarget, bool AssumeSingleUse=false)
Check if Op is a load operation that could be folded into a vector splat instruction as a memory oper...
bool isZeroNode(SDValue Elt)
Returns true if Elt is a constant zero or floating point constant +0.0.
bool mayFoldIntoZeroExtend(SDValue Op)
Check if Op is an operation that could be folded into a zero extend x86 instruction.
bool mayFoldIntoStore(SDValue Op)
Check if Op is a value that could be used to fold a store into some other x86 instruction as a memory...
bool isExtendedSwiftAsyncFrameSupported(const X86Subtarget &Subtarget, const MachineFunction &MF)
True if the target supports the extended frame for async Swift functions.
int getRoundingModeX86(unsigned RM)
Convert LLVM rounding mode to X86 rounding mode.
bool isCalleePop(CallingConv::ID CallingConv, bool is64Bit, bool IsVarArg, bool GuaranteeTCO)
Determines whether the callee is required to pop its own arguments.
bool mayFoldLoad(SDValue Op, const X86Subtarget &Subtarget, bool AssumeSingleUse=false, bool IgnoreAlignment=false)
Check if Op is a load operation that could be folded into some other x86 instruction as a memory oper...
bool isOffsetSuitableForCodeModel(int64_t Offset, CodeModel::Model M, bool hasSymbolicDisplacement)
Returns true of the given offset can be fit into displacement field of the instruction.
bool isConstantSplat(SDValue Op, APInt &SplatVal, bool AllowPartialUndefs)
If Op is a constant whose elements are all the same constant or undefined, return true and return the...
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
InstructionCost Cost
@ Known
Known to have no common set bits.
@ Load
The value being inserted comes from a load (InsertElement only).
@ Store
The extracted value is stored (ExtractElement only).
void createUnpackShuffleMask(EVT VT, SmallVectorImpl< int > &Mask, bool Lo, bool Unary)
Generate unpacklo/unpackhi shuffle mask.
void createSplat2ShuffleMask(MVT VT, SmallVectorImpl< int > &Mask, bool Lo)
Similar to unpacklo/unpackhi, but without the 128-bit lane limitation imposed by AVX and specific to ...
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
@ Fast
Assign the register banks as fast as possible (default).
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
ExceptionHandling
Definition CodeGen.h:54
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
UndefPoisonKind
Enumeration to track whether we are interested in Undef, Poison, or both.
Definition UndefPoison.h:20
#define N
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
bool isFloatingPoint() const
Return true if this is a FP or a vector FP type.
Definition ValueTypes.h:155
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
Definition ValueTypes.h:61
bool isVector() const
Return true if this is a vector value type.
Definition ValueTypes.h:176
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
Definition ValueTypes.h:346
bool isScalarInteger() const
Return true if this is an integer, but not a vector.
Definition ValueTypes.h:165
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition ValueTypes.h:160
This class contains a discriminated union of information about pointers in memory operands,...