LLVM 23.0.0git
SystemZISelLowering.h
Go to the documentation of this file.
1//===-- SystemZISelLowering.h - SystemZ 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 SystemZ uses to lower LLVM code into a
10// selection DAG.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZISELLOWERING_H
15#define LLVM_LIB_TARGET_SYSTEMZ_SYSTEMZISELLOWERING_H
16
17#include "SystemZ.h"
18#include "SystemZInstrInfo.h"
22#include <optional>
23
24namespace llvm {
25
26namespace SystemZICMP {
27// Describes whether an integer comparison needs to be signed or unsigned,
28// or whether either type is OK.
29enum {
33};
34} // end namespace SystemZICMP
35
36class SystemZSubtarget;
37
39public:
40 explicit SystemZTargetLowering(const TargetMachine &TM,
41 const SystemZSubtarget &STI);
42
43 bool useSoftFloat() const override;
44
45 // Override TargetLowering.
46 MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override {
47 return MVT::i32;
48 }
49 unsigned getVectorIdxWidth(const DataLayout &DL) const override {
50 // Only the lower 12 bits of an element index are used, so we don't
51 // want to clobber the upper 32 bits of a GPR unnecessarily.
52 return 32;
53 }
55 const override {
56 // Widen subvectors to the full width rather than promoting integer
57 // elements. This is better because:
58 //
59 // (a) it means that we can handle the ABI for passing and returning
60 // sub-128 vectors without having to handle them as legal types.
61 //
62 // (b) we don't have instructions to extend on load and truncate on store,
63 // so promoting the integers is less efficient.
64 //
65 // (c) there are no multiplication instructions for the widest integer
66 // type (v2i64).
67
68 // Expand (narrow) f16 vectors during type legalization to avoid
69 // operations for all elements as with expansion after widening.
70 if (VT.getScalarType() == MVT::f16)
73 if (VT.getScalarSizeInBits() % 8 == 0)
74 return TypeWidenVector;
76 }
77 unsigned
79 std::optional<MVT> RegisterVT) const override {
80 // i128 inline assembly operand.
81 if (VT == MVT::i128 && RegisterVT && *RegisterVT == MVT::Untyped)
82 return 1;
83 return TargetLowering::getNumRegisters(Context, VT);
84 }
85 unsigned
87 EVT VT, EVT &IntermediateVT,
88 unsigned &NumIntermediates,
89 MVT &RegisterVT) const override;
91 EVT VT) const override;
94 EVT VT) const override;
95 bool isCheapToSpeculateCtlz(Type *) const override { return true; }
96 bool isCheapToSpeculateCttz(Type *) const override { return true; }
97 bool preferZeroCompareBranch() const override { return true; }
98 bool isMaskAndCmp0FoldingBeneficial(const Instruction &AndI) const override {
100 return Mask && Mask->getValue().isIntN(16);
101 }
102 bool convertSetCCLogicToBitwiseLogic(EVT VT) const override {
103 return VT.isScalarInteger();
104 }
106 EVT) const override;
108 EVT VT) const override;
109 bool isFPImmLegal(const APFloat &Imm, EVT VT,
110 bool ForCodeSize) const override;
111 bool ShouldShrinkFPConstant(EVT VT) const override {
112 // Do not shrink 64-bit FP constpool entries since LDEB is slower than
113 // LD, and having the full constant in memory enables reg/mem opcodes.
114 return VT != MVT::f64;
115 }
117 MachineBasicBlock *MBB) const;
118
120 MachineBasicBlock *MBB) const;
121
122 bool hasInlineStackProbe(const MachineFunction &MF) const override;
126 shouldExpandAtomicRMWInIR(const AtomicRMWInst *RMW) const override;
127 bool isLegalICmpImmediate(int64_t Imm) const override;
128 bool isLegalAddImmediate(int64_t Imm) const override;
129 bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty,
130 unsigned AS,
131 Instruction *I = nullptr) const override;
132 bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS, Align Alignment,
134 unsigned *Fast) const override;
135 bool findOptimalMemOpLowering(LLVMContext &Context, std::vector<EVT> &MemOps,
136 unsigned Limit, const MemOp &Op, unsigned DstAS,
137 unsigned SrcAS,
138 const AttributeList &FuncAttributes,
139 EVT *LargestVT = nullptr) const override;
140 EVT getOptimalMemOpType(LLVMContext &Context, const MemOp &Op,
141 const AttributeList &FuncAttributes) const override;
142 bool isTruncateFree(Type *, Type *) const override;
143 bool isTruncateFree(EVT, EVT) const override;
144
145 bool shouldFormOverflowOp(unsigned Opcode, EVT VT,
146 bool MathUsed) const override {
147 // Form add and sub with overflow intrinsics regardless of any extra
148 // users of the math result.
149 return VT == MVT::i32 || VT == MVT::i64 || VT == MVT::i128;
150 }
151
152 bool shouldConsiderGEPOffsetSplit() const override { return true; }
153
154 bool preferSelectsOverBooleanArithmetic(EVT VT) const override {
155 return true;
156 }
157
158 // This function currently returns cost for srl/ipm/cc sequence for merging.
159 CondMergingParams
161 const Value *Rhs) const override;
162
163 // Handle Lowering flag assembly outputs.
165 const SDLoc &DL,
166 const AsmOperandInfo &Constraint,
167 SelectionDAG &DAG) const override;
168
169 std::pair<unsigned, const TargetRegisterClass *>
171 StringRef Constraint, MVT VT) const override;
173 getConstraintType(StringRef Constraint) const override;
175 getSingleConstraintMatchWeight(AsmOperandInfo &info,
176 const char *constraint) const override;
178 std::vector<SDValue> &Ops,
179 SelectionDAG &DAG) const override;
180
182 getInlineAsmMemConstraint(StringRef ConstraintCode) const override {
183 if (ConstraintCode.size() == 1) {
184 switch(ConstraintCode[0]) {
185 default:
186 break;
187 case 'o':
189 case 'Q':
191 case 'R':
193 case 'S':
195 case 'T':
197 }
198 } else if (ConstraintCode.size() == 2 && ConstraintCode[0] == 'Z') {
199 switch (ConstraintCode[1]) {
200 default:
201 break;
202 case 'Q':
204 case 'R':
206 case 'S':
208 case 'T':
210 }
211 }
212 return TargetLowering::getInlineAsmMemConstraint(ConstraintCode);
213 }
214
215 Register getRegisterByName(const char *RegName, LLT VT,
216 const MachineFunction &MF) const override;
217
218 /// If a physical register, this returns the register that receives the
219 /// exception address on entry to an EH pad.
221 getExceptionPointerRegister(const Constant *PersonalityFn) const override;
222
223 /// If a physical register, this returns the register that receives the
224 /// exception typeid on entry to a landing pad.
226 getExceptionSelectorRegister(const Constant *PersonalityFn) const override;
227
228 /// Override to support customized stack guard loading.
229 bool useLoadStackGuardNode(const Module &M) const override { return true; }
230 void
232 const LibcallLoweringInfo &Libcalls) const override {}
233
236 MachineBasicBlock *BB) const override;
237 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
239 SelectionDAG &DAG) const override;
241 SelectionDAG &DAG) const override;
242 const MCPhysReg *getScratchRegisters(CallingConv::ID CC) const override;
243 bool allowTruncateForTailCall(Type *, Type *) const override;
244 bool mayBeEmittedAsTailCall(const CallInst *CI) const override;
246 SelectionDAG & DAG, const SDLoc &DL, SDValue Val, SDValue *Parts,
247 unsigned NumParts, MVT PartVT, std::optional<CallingConv::ID> CC)
248 const override;
250 SelectionDAG & DAG, const SDLoc &DL, const SDValue *Parts,
251 unsigned NumParts, MVT PartVT, EVT ValueVT,
252 std::optional<CallingConv::ID> CC) const override;
254 bool isVarArg,
256 const SDLoc &DL, SelectionDAG &DAG,
257 SmallVectorImpl<SDValue> &InVals) const override;
258 SDValue LowerCall(CallLoweringInfo &CLI,
259 SmallVectorImpl<SDValue> &InVals) const override;
260
261 std::pair<SDValue, SDValue>
262 makeExternalCall(SDValue Chain, SelectionDAG &DAG, const char *CalleeName,
263 EVT RetVT, ArrayRef<SDValue> Ops, CallingConv::ID CallConv,
264 bool IsSigned, SDLoc DL, bool DoesNotReturn,
265 bool IsReturnValueUsed) const;
266
267 SDValue useLibCall(SelectionDAG &DAG, RTLIB::Libcall LC, MVT VT, SDValue Arg,
268 SDLoc DL, SDValue Chain, bool IsStrict) const;
269
271 bool isVarArg,
273 LLVMContext &Context,
274 const Type *RetTy) const override;
275 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
277 const SmallVectorImpl<SDValue> &OutVals, const SDLoc &DL,
278 SelectionDAG &DAG) const override;
279 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
280
281 /// Determine which of the bits specified in Mask are known to be either
282 /// zero or one and return them in the KnownZero/KnownOne bitsets.
284 KnownBits &Known,
285 const APInt &DemandedElts,
286 const SelectionDAG &DAG,
287 unsigned Depth = 0) const override;
288
289 /// Determine the number of bits in the operation that are sign bits.
291 const APInt &DemandedElts,
292 const SelectionDAG &DAG,
293 unsigned Depth) const override;
294
296 SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG,
297 bool PoisonOnly, unsigned Depth) const override;
298
300 return ISD::ANY_EXTEND;
301 }
303 return ISD::ZERO_EXTEND;
304 }
305
306 bool supportSwiftError() const override {
307 return true;
308 }
309
310 unsigned getStackProbeSize(const MachineFunction &MF) const;
311 bool hasAndNot(SDValue Y) const override;
312
313private:
314 const SystemZSubtarget &Subtarget;
315
316 // Implement LowerOperation for individual opcodes.
317 SDValue getVectorCmp(SelectionDAG &DAG, unsigned Opcode,
318 const SDLoc &DL, EVT VT,
319 SDValue CmpOp0, SDValue CmpOp1, SDValue Chain) const;
320 SDValue lowerVectorSETCC(SelectionDAG &DAG, const SDLoc &DL,
321 EVT VT, ISD::CondCode CC,
322 SDValue CmpOp0, SDValue CmpOp1,
323 SDValue Chain = SDValue(),
324 bool IsSignaling = false) const;
325 SDValue lowerSETCC(SDValue Op, SelectionDAG &DAG) const;
326 SDValue lowerSTRICT_FSETCC(SDValue Op, SelectionDAG &DAG,
327 bool IsSignaling) const;
328 SDValue lowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
329 SDValue lowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
330 SDValue lowerGlobalAddress(GlobalAddressSDNode *Node,
331 SelectionDAG &DAG) const;
332 SDValue lowerTLSGetOffset(GlobalAddressSDNode *Node,
333 SelectionDAG &DAG, unsigned Opcode,
334 SDValue GOTOffset) const;
335 SDValue lowerThreadPointer(const SDLoc &DL, SelectionDAG &DAG) const;
336 SDValue lowerGlobalTLSAddress(GlobalAddressSDNode *Node,
337 SelectionDAG &DAG) const;
338 SDValue lowerBlockAddress(BlockAddressSDNode *Node,
339 SelectionDAG &DAG) const;
340 SDValue lowerJumpTable(JumpTableSDNode *JT, SelectionDAG &DAG) const;
341 SDValue lowerConstantPool(ConstantPoolSDNode *CP, SelectionDAG &DAG) const;
344 SDValue lowerVASTART(SDValue Op, SelectionDAG &DAG) const;
345 SDValue lowerVASTART_ELF(SDValue Op, SelectionDAG &DAG) const;
346 SDValue lowerVASTART_XPLINK(SDValue Op, SelectionDAG &DAG) const;
347 SDValue lowerVACOPY(SDValue Op, SelectionDAG &DAG) const;
348 SDValue lowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
349 SDValue lowerDYNAMIC_STACKALLOC_ELF(SDValue Op, SelectionDAG &DAG) const;
350 SDValue lowerDYNAMIC_STACKALLOC_XPLINK(SDValue Op, SelectionDAG &DAG) const;
351 SDValue lowerGET_DYNAMIC_AREA_OFFSET(SDValue Op, SelectionDAG &DAG) const;
352 SDValue lowerMULH(SDValue Op, SelectionDAG &DAG, unsigned Opcode) const;
353 SDValue lowerSMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
354 SDValue lowerUMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
355 SDValue lowerSDIVREM(SDValue Op, SelectionDAG &DAG) const;
356 SDValue lowerUDIVREM(SDValue Op, SelectionDAG &DAG) const;
357 SDValue lowerXALUO(SDValue Op, SelectionDAG &DAG) const;
358 SDValue lowerUADDSUBO_CARRY(SDValue Op, SelectionDAG &DAG) const;
359 SDValue lowerBITCAST(SDValue Op, SelectionDAG &DAG) const;
360 SDValue lowerOR(SDValue Op, SelectionDAG &DAG) const;
361 SDValue lowerCTPOP(SDValue Op, SelectionDAG &DAG) const;
362 SDValue lowerVECREDUCE_ADD(SDValue Op, SelectionDAG &DAG) const;
363 SDValue lowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG) const;
364 SDValue lowerATOMIC_LOAD(SDValue Op, SelectionDAG &DAG) const;
365 SDValue lowerATOMIC_STORE(SDValue Op, SelectionDAG &DAG) const;
366 SDValue lowerATOMIC_LDST_I128(SDValue Op, SelectionDAG &DAG) const;
367 SDValue lowerATOMIC_LOAD_OP(SDValue Op, SelectionDAG &DAG,
368 unsigned Opcode) const;
369 SDValue lowerATOMIC_LOAD_SUB(SDValue Op, SelectionDAG &DAG) const;
370 SDValue lowerATOMIC_CMP_SWAP(SDValue Op, SelectionDAG &DAG) const;
371 SDValue lowerSTACKSAVE(SDValue Op, SelectionDAG &DAG) const;
372 SDValue lowerSTACKRESTORE(SDValue Op, SelectionDAG &DAG) const;
373 SDValue lowerPREFETCH(SDValue Op, SelectionDAG &DAG) const;
374 SDValue lowerINTRINSIC_W_CHAIN(SDValue Op, SelectionDAG &DAG) const;
375 SDValue lowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
376 bool isVectorElementLoad(SDValue Op) const;
377 SDValue buildVector(SelectionDAG &DAG, const SDLoc &DL, EVT VT,
378 SmallVectorImpl<SDValue> &Elems) const;
381 SDValue lowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG) const;
382 SDValue lowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
383 SDValue lowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
384 SDValue lowerSIGN_EXTEND_VECTOR_INREG(SDValue Op, SelectionDAG &DAG) const;
385 SDValue lowerZERO_EXTEND_VECTOR_INREG(SDValue Op, SelectionDAG &DAG) const;
386 SDValue lowerShift(SDValue Op, SelectionDAG &DAG, unsigned ByScalar) const;
387 SDValue lowerFSHL(SDValue Op, SelectionDAG &DAG) const;
388 SDValue lowerFSHR(SDValue Op, SelectionDAG &DAG) const;
389 SDValue lowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const;
390 SDValue lower_FP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
391 SDValue lower_INT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
392 SDValue lowerLoadF16(SDValue Op, SelectionDAG &DAG) const;
393 SDValue lowerStoreF16(SDValue Op, SelectionDAG &DAG) const;
394
395 SDValue lowerIS_FPCLASS(SDValue Op, SelectionDAG &DAG) const;
396 SDValue lowerGET_ROUNDING(SDValue Op, SelectionDAG &DAG) const;
397 SDValue lowerREADCYCLECOUNTER(SDValue Op, SelectionDAG &DAG) const;
398
399 bool canTreatAsByteVector(EVT VT) const;
400 SDValue combineExtract(const SDLoc &DL, EVT ElemVT, EVT VecVT, SDValue OrigOp,
401 unsigned Index, DAGCombinerInfo &DCI,
402 bool Force) const;
403 SDValue combineTruncateExtract(const SDLoc &DL, EVT TruncVT, SDValue Op,
404 DAGCombinerInfo &DCI) const;
405 SDValue combineZERO_EXTEND(SDNode *N, DAGCombinerInfo &DCI) const;
406 SDValue combineSIGN_EXTEND(SDNode *N, DAGCombinerInfo &DCI) const;
407 SDValue combineSIGN_EXTEND_INREG(SDNode *N, DAGCombinerInfo &DCI) const;
408 SDValue combineMERGE(SDNode *N, DAGCombinerInfo &DCI) const;
409 bool canLoadStoreByteSwapped(EVT VT) const;
410 SDValue combineLOAD(SDNode *N, DAGCombinerInfo &DCI) const;
411 SDValue combineSTORE(SDNode *N, DAGCombinerInfo &DCI) const;
412 SDValue combineVECTOR_SHUFFLE(SDNode *N, DAGCombinerInfo &DCI) const;
413 SDValue combineEXTRACT_VECTOR_ELT(SDNode *N, DAGCombinerInfo &DCI) const;
414 SDValue combineJOIN_DWORDS(SDNode *N, DAGCombinerInfo &DCI) const;
415 SDValue combineFP_ROUND(SDNode *N, DAGCombinerInfo &DCI) const;
416 SDValue combineFP_EXTEND(SDNode *N, DAGCombinerInfo &DCI) const;
417 SDValue combineINT_TO_FP(SDNode *N, DAGCombinerInfo &DCI) const;
418 SDValue combineFCOPYSIGN(SDNode *N, DAGCombinerInfo &DCI) const;
419 SDValue combineBSWAP(SDNode *N, DAGCombinerInfo &DCI) const;
420 SDValue combineSETCC(SDNode *N, DAGCombinerInfo &DCI) const;
421 SDValue combineBR_CCMASK(SDNode *N, DAGCombinerInfo &DCI) const;
422 SDValue combineSELECT_CCMASK(SDNode *N, DAGCombinerInfo &DCI) const;
423 SDValue combineGET_CCMASK(SDNode *N, DAGCombinerInfo &DCI) const;
424 SDValue combineShiftToMulAddHigh(SDNode *N, DAGCombinerInfo &DCI) const;
425 SDValue combineMUL(SDNode *N, DAGCombinerInfo &DCI) const;
426 SDValue combineIntDIVREM(SDNode *N, DAGCombinerInfo &DCI) const;
427 SDValue combineINTRINSIC(SDNode *N, DAGCombinerInfo &DCI) const;
428
429 SDValue unwrapAddress(SDValue N) const override;
430
431 // If the last instruction before MBBI in MBB was some form of COMPARE,
432 // try to replace it with a COMPARE AND BRANCH just before MBBI.
433 // CCMask and Target are the BRC-like operands for the branch.
434 // Return true if the change was made.
435 bool convertPrevCompareToBranch(MachineBasicBlock *MBB,
437 unsigned CCMask,
439
440 // Implement EmitInstrWithCustomInserter for individual operation types.
441 MachineBasicBlock *emitAdjCallStack(MachineInstr &MI,
442 MachineBasicBlock *BB) const;
443 MachineBasicBlock *emitSelect(MachineInstr &MI, MachineBasicBlock *BB) const;
445 unsigned StoreOpcode, unsigned STOCOpcode,
446 bool Invert) const;
448 bool Unsigned) const;
449 MachineBasicBlock *emitPair128(MachineInstr &MI,
450 MachineBasicBlock *MBB) const;
452 bool ClearEven) const;
453 MachineBasicBlock *emitAtomicLoadBinary(MachineInstr &MI,
455 unsigned BinOpcode,
456 bool Invert = false) const;
457 MachineBasicBlock *emitAtomicLoadMinMax(MachineInstr &MI,
459 unsigned CompareOpcode,
460 unsigned KeepOldMask) const;
461 MachineBasicBlock *emitAtomicCmpSwapW(MachineInstr &MI,
462 MachineBasicBlock *BB) const;
463 MachineBasicBlock *emitMemMemWrapper(MachineInstr &MI, MachineBasicBlock *BB,
464 unsigned Opcode,
465 bool IsMemset = false) const;
466 MachineBasicBlock *emitStringWrapper(MachineInstr &MI, MachineBasicBlock *BB,
467 unsigned Opcode) const;
468 MachineBasicBlock *emitTransactionBegin(MachineInstr &MI,
470 unsigned Opcode, bool NoFloat) const;
471 MachineBasicBlock *emitLoadAndTestCmp0(MachineInstr &MI,
473 unsigned Opcode) const;
474 MachineBasicBlock *emitProbedAlloca(MachineInstr &MI,
475 MachineBasicBlock *MBB) const;
476
477 SDValue getBackchainAddress(SDValue SP, SelectionDAG &DAG) const;
478
480 getTargetMMOFlags(const Instruction &I) const override;
481 const TargetRegisterClass *getRepRegClassFor(MVT VT) const override;
482
483private:
484 bool isInternal(const Function *Fn) const;
485 mutable std::map<const Function *, bool> IsInternalCache;
486 void verifyNarrowIntegerArgs_Call(const SmallVectorImpl<ISD::OutputArg> &Outs,
487 const Function *F, SDValue Callee) const;
488 void verifyNarrowIntegerArgs_Ret(const SmallVectorImpl<ISD::OutputArg> &Outs,
489 const Function *F) const;
490 bool
491 verifyNarrowIntegerArgs(const SmallVectorImpl<ISD::OutputArg> &Outs) const;
492
493public:
494};
495
497private:
498 APInt IntBits; // The 128 bits as an integer.
499 APInt SplatBits; // Smallest splat value.
500 APInt SplatUndef; // Bits correspoding to undef operands of the BVN.
501 unsigned SplatBitSize = 0;
502 bool isFP128 = false;
503public:
504 unsigned Opcode = 0;
509 : SystemZVectorConstantInfo(FPImm.bitcastToAPInt()) {
510 isFP128 = (&FPImm.getSemantics() == &APFloat::IEEEquad());
511 }
513 bool isVectorConstantLegal(const SystemZSubtarget &Subtarget);
514};
515
516} // end namespace llvm
517
518#endif
return SDValue()
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
Function Alias Analysis Results
IRTranslator LLVM IR MI
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define RegName(no)
lazy value info
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Register const TargetRegisterInfo * TRI
static SDValue combineLOAD(SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const NVPTXSubtarget &STI)
static SDValue combineSTORE(SDNode *N, TargetLowering::DAGCombinerInfo &DCI, const NVPTXSubtarget &STI)
static SDValue lowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG, const RISCVSubtarget &Subtarget)
static SDValue lowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG, const RISCVSubtarget &Subtarget)
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 SDValue lowerFRAMEADDR(SDValue Op, SelectionDAG &DAG, const VETargetLowering &TLI, const VESubtarget *Subtarget)
static SDValue lowerRETURNADDR(SDValue Op, SelectionDAG &DAG, const VETargetLowering &TLI, const VESubtarget *Subtarget)
static SDValue combineFP_EXTEND(SDNode *N, SelectionDAG &DAG, TargetLowering::DAGCombinerInfo &DCI, const X86Subtarget &Subtarget)
static SDValue combineFP_ROUND(SDNode *N, SelectionDAG &DAG, const X86Subtarget &Subtarget)
static const fltSemantics & IEEEquad()
Definition APFloat.h:298
const fltSemantics & getSemantics() const
Definition APFloat.h:1520
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:40
an instruction that atomically reads a memory location, combines it with another value,...
A "pseudo-class" with methods for operating on BUILD_VECTORs.
This class represents a function call, abstracting a target machine's calling convention.
This is the shared class of boolean and integer constants.
Definition Constants.h:87
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
constexpr bool isScalar() const
Exactly one element.
Definition TypeSize.h:320
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.
An instruction for reading from memory.
Machine Value Type.
uint64_t getScalarSizeInBits() const
ElementCount getVectorElementCount() const
MVT getScalarType() const
If this is a vector, return the element type, otherwise return this.
MachineInstrBundleIterator< MachineInstr > iterator
Representation of each machine instruction.
Flags
Flags values. These may be or'd together.
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:20
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...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr size_t size() const
size - Get the string size.
Definition StringRef.h:146
AtomicExpansionKind shouldExpandAtomicRMWInIR(const AtomicRMWInst *RMW) const override
Returns how the IR-level AtomicExpand pass should expand the given AtomicRMW, if at all.
bool shouldFormOverflowOp(unsigned Opcode, EVT VT, bool MathUsed) const override
Try to convert math with an overflow comparison into the corresponding DAG node operation.
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 isMaskAndCmp0FoldingBeneficial(const Instruction &AndI) const override
Return if the target supports combining a chain like:
SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override
This callback is invoked for operations that are unsupported by the target, which are registered to u...
void insertSSPDeclarations(Module &M, const LibcallLoweringInfo &Libcalls) const override
Inserts necessary declarations for SSP (stack protection) purpose.
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,...
ISD::NodeType getExtendForAtomicOps() const override
Returns how the platform's atomic operations are extended (ZERO_EXTEND, SIGN_EXTEND,...
bool useLoadStackGuardNode(const Module &M) const override
Override to support customized stack guard loading.
bool hasInlineStackProbe(const MachineFunction &MF) const override
Returns true if stack probing through inline assembly is requested.
MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr &MI, MachineBasicBlock *BB) const override
This method should be implemented by targets that mark instructions with the 'usesCustomInserter' fla...
bool convertSetCCLogicToBitwiseLogic(EVT VT) const override
Use bitwise logic to make pairs of compares more efficient.
MachineBasicBlock * emitEHSjLjSetJmp(MachineInstr &MI, MachineBasicBlock *MBB) const
AtomicExpansionKind shouldCastAtomicLoadInIR(LoadInst *LI) const override
Returns how the given (atomic) load should be cast by the IR-level AtomicExpand pass.
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &, EVT) const override
Return the ValueType of the result of SETCC operations.
bool allowTruncateForTailCall(Type *, Type *) const override
Return true if a truncation from FromTy to ToTy is permitted when deciding whether a call is in tail ...
SDValue LowerAsmOutputForConstraint(SDValue &Chain, SDValue &Flag, const SDLoc &DL, const AsmOperandInfo &Constraint, SelectionDAG &DAG) const override
bool preferSelectsOverBooleanArithmetic(EVT VT) const override
Should we prefer selects to doing arithmetic on boolean types.
SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg, const SmallVectorImpl< ISD::OutputArg > &Outs, const SmallVectorImpl< SDValue > &OutVals, const SDLoc &DL, SelectionDAG &DAG) const override
This hook must be implemented to lower outgoing return values, described by the Outs array,...
bool preferZeroCompareBranch() const override
Return true if the heuristic to prefer icmp eq zero should be used in code gen prepare.
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...
MachineBasicBlock * emitEHSjLjLongJmp(MachineInstr &MI, MachineBasicBlock *MBB) const
CondMergingParams getJumpConditionMergingParams(Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs) const override
bool CanLowerReturn(CallingConv::ID CallConv, MachineFunction &MF, bool isVarArg, const SmallVectorImpl< ISD::OutputArg > &Outs, LLVMContext &Context, const Type *RetTy) const override
This hook should be implemented to check whether the return values described by the Outs array can fi...
std::pair< SDValue, SDValue > makeExternalCall(SDValue Chain, SelectionDAG &DAG, const char *CalleeName, EVT RetVT, ArrayRef< SDValue > Ops, CallingConv::ID CallConv, bool IsSigned, SDLoc DL, bool DoesNotReturn, bool IsReturnValueUsed) const
bool shouldConsiderGEPOffsetSplit() const override
bool supportSwiftError() const override
Return true if the target supports swifterror attribute.
bool mayBeEmittedAsTailCall(const CallInst *CI) const override
Return true if the target may be able emit the call instruction as a tail call.
bool splitValueIntoRegisterParts(SelectionDAG &DAG, const SDLoc &DL, SDValue Val, SDValue *Parts, unsigned NumParts, MVT PartVT, std::optional< CallingConv::ID > CC) const override
Target-specific splitting of values into parts that fit a register storing a legal type.
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 getNumRegistersForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const override
Certain targets require unusual breakdowns of certain types.
SystemZTargetLowering(const TargetMachine &TM, const SystemZSubtarget &STI)
bool isCheapToSpeculateCtlz(Type *) const override
Return true if it is cheap to speculate a call to intrinsic ctlz.
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.
bool isLegalICmpImmediate(int64_t Imm) const override
Return true if the specified immediate is legal icmp immediate, that is the target has icmp instructi...
std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const override
Given a physical register constraint (e.g.
TargetLowering::ConstraintWeight getSingleConstraintMatchWeight(AsmOperandInfo &info, const char *constraint) const override
Examine constraint string and operand type and determine a weight value.
bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS, Align Alignment, MachineMemOperand::Flags Flags, unsigned *Fast) const override
Determine if the target supports unaligned memory accesses.
const MCPhysReg * getScratchRegisters(CallingConv::ID CC) const override
Returns a 0 terminated array of registers that can be safely used as scratch registers.
TargetLowering::ConstraintType getConstraintType(StringRef Constraint) const override
Given a constraint, return the type of constraint it is for this target.
bool ShouldShrinkFPConstant(EVT VT) const override
If true, then instruction selection should seek to shrink the FP constant of the specified type to a ...
bool isFPImmLegal(const APFloat &Imm, EVT VT, bool ForCodeSize) const override
Returns true if the target can instruction select the specified FP immediate natively.
Register getExceptionPointerRegister(const Constant *PersonalityFn) const override
If a physical register, this returns the register that receives the exception address on entry to an ...
SDValue joinRegisterPartsIntoValue(SelectionDAG &DAG, const SDLoc &DL, const SDValue *Parts, unsigned NumParts, MVT PartVT, EVT ValueVT, std::optional< CallingConv::ID > CC) const override
Target-specific combining of register parts into its original value.
unsigned getNumRegisters(LLVMContext &Context, EVT VT, std::optional< MVT > RegisterVT) const override
Return the number of registers that this ValueType will eventually require.
bool isTruncateFree(Type *, Type *) const override
Return true if it's free to truncate a value of type FromTy to type ToTy.
SDValue useLibCall(SelectionDAG &DAG, RTLIB::Libcall LC, MVT VT, SDValue Arg, SDLoc DL, SDValue Chain, bool IsStrict) const
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.
ISD::NodeType getExtendForAtomicCmpSwapArg() const override
Returns how the platform's atomic compare and swap expects its comparison value to be extended (ZERO_...
void LowerOperationWrapper(SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG) const override
This callback is invoked by the type legalizer to legalize nodes with an illegal operand type but leg...
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...
InlineAsm::ConstraintCode getInlineAsmMemConstraint(StringRef ConstraintCode) const override
SDValue LowerCall(CallLoweringInfo &CLI, SmallVectorImpl< SDValue > &InVals) const override
This hook must be implemented to lower calls into the specified DAG.
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 isCheapToSpeculateCttz(Type *) const override
Return true if it is cheap to speculate a call to intrinsic cttz.
bool findOptimalMemOpLowering(LLVMContext &Context, std::vector< EVT > &MemOps, unsigned Limit, const MemOp &Op, unsigned DstAS, unsigned SrcAS, const AttributeList &FuncAttributes, EVT *LargestVT=nullptr) const override
Determines the optimal series of memory ops to replace the memset / memcpy.
void ReplaceNodeResults(SDNode *N, SmallVectorImpl< SDValue > &Results, SelectionDAG &DAG) const override
This callback is invoked when a node result type is illegal for the target, and the operation was reg...
void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint, std::vector< SDValue > &Ops, SelectionDAG &DAG) const override
Lower the specified operand into the Ops vector.
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 isGuaranteedNotToBeUndefOrPoisonForTargetNode(SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG, bool PoisonOnly, unsigned Depth) const override
Return true if this function can prove that Op is never poison and, if PoisonOnly is false,...
MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override
Return the type to use for a scalar shift opcode, given the shifted amount type.
AtomicExpansionKind shouldCastAtomicStoreInIR(StoreInst *SI) const override
Returns how the given (atomic) store should be cast by the IR-level AtomicExpand pass into.
Register getRegisterByName(const char *RegName, LLT VT, const MachineFunction &MF) const override
Return the register ID of the name passed in.
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...
SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv, bool isVarArg, const SmallVectorImpl< ISD::InputArg > &Ins, const SDLoc &DL, SelectionDAG &DAG, SmallVectorImpl< SDValue > &InVals) const override
This hook must be implemented to lower the incoming (formal) arguments, described by the Ins array,...
TargetLoweringBase::LegalizeTypeAction getPreferredVectorAction(MVT VT) const override
Return the preferred vector type legalization action.
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...
unsigned getStackProbeSize(const MachineFunction &MF) const
unsigned getVectorIdxWidth(const DataLayout &DL) const override
Returns the type to be used for the index operand vector operations.
LegalizeTypeAction
This enum indicates whether a types are legal for a target, and if not, what action should be used to...
virtual unsigned getNumRegisters(LLVMContext &Context, EVT VT, std::optional< MVT > RegisterVT=std::nullopt) const
Return the number of registers that this ValueType will eventually require.
virtual TargetLoweringBase::LegalizeTypeAction getPreferredVectorAction(MVT VT) const
Return the preferred vector type legalization action.
AtomicExpansionKind
Enum that specifies what an atomic load/AtomicRMWInst is expanded to, if at all.
virtual InlineAsm::ConstraintCode getInlineAsmMemConstraint(StringRef ConstraintCode) const
TargetLowering(const TargetLowering &)=delete
Primary interface to the complete machine description for the target machine.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
Target - Wrapper for Target specific information.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
Value * getOperand(unsigned i) const
Definition User.h:207
LLVM Value Representation.
Definition Value.h:75
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ Fast
Attempts to make calls as fast as possible (e.g.
Definition CallingConv.h:41
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:41
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:853
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:850
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
uint16_t MCPhysReg
An unsigned integer type large enough to represent all physical registers, but not necessarily virtua...
Definition MCRegister.h:21
DWARFExpression::Operation Op
#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 isScalarInteger() const
Return true if this is an integer, but not a vector.
Definition ValueTypes.h:157
SmallVector< unsigned, 2 > OpVals
bool isVectorConstantLegal(const SystemZSubtarget &Subtarget)