LLVM 24.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"
23#include <optional>
24
25namespace llvm {
26
27namespace SystemZICMP {
28// Describes whether an integer comparison needs to be signed or unsigned,
29// or whether either type is OK.
30enum {
34};
35} // end namespace SystemZICMP
36
37class SystemZSubtarget;
38
40public:
41 explicit SystemZTargetLowering(const TargetMachine &TM,
42 const SystemZSubtarget &STI);
43
44 bool useSoftFloat() const override;
45
46 // Override TargetLowering.
47 MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override {
48 return MVT::i32;
49 }
50 unsigned getVectorIdxWidth(const DataLayout &DL) const override {
51 // Only the lower 12 bits of an element index are used, so we don't
52 // want to clobber the upper 32 bits of a GPR unnecessarily.
53 return 32;
54 }
56 getPreferredVectorAction(MVT VT) const override;
57 unsigned
59 std::optional<MVT> RegisterVT) const override {
60 // i128 inline assembly operand.
61 if (VT == MVT::i128 && RegisterVT && *RegisterVT == MVT::Untyped)
62 return 1;
63 return TargetLowering::getNumRegisters(Context, VT);
64 }
65 unsigned
67 EVT VT, EVT &IntermediateVT,
68 unsigned &NumIntermediates,
69 MVT &RegisterVT) const override;
71 EVT VT) const override;
74 EVT VT) const override;
75 bool isCheapToSpeculateCtlz(Type *) const override { return true; }
76 bool isCheapToSpeculateCttz(Type *) const override { return true; }
77 bool preferZeroCompareBranch() const override { return true; }
78 bool isMaskAndCmp0FoldingBeneficial(const Instruction &AndI) const override {
80 return Mask && Mask->getValue().isIntN(16);
81 }
82 bool convertSetCCLogicToBitwiseLogic(EVT VT) const override {
83 return VT.isScalarInteger();
84 }
86 EVT) const override;
88 EVT VT) const override;
90 bool ForCodeSize) const override;
91 bool ShouldShrinkFPConstant(EVT VT) const override {
92 // Do not shrink 64-bit FP constpool entries since LDEB is slower than
93 // LD, and having the full constant in memory enables reg/mem opcodes.
94 return VT != MVT::f64;
95 }
97 MachineBasicBlock *MBB) const;
98
100 MachineBasicBlock *MBB) const;
101
102 bool canMergeStoresTo(unsigned AS, EVT MemVT,
103 const MachineFunction &MF) const override;
104
105 bool aggressivelyPreferBuildVectorSources(EVT VecVT) const override;
106
107 bool hasInlineStackProbe(const MachineFunction &MF) const override;
111 shouldExpandAtomicRMWInIR(const AtomicRMWInst *RMW) const override;
112 bool isLegalICmpImmediate(int64_t Imm) const override;
113 bool isLegalAddImmediate(int64_t Imm) const override;
114 bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty,
115 unsigned AS,
116 Instruction *I = nullptr) const override;
117 bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS, Align Alignment,
119 unsigned *Fast) const override;
120 bool findOptimalMemOpLowering(LLVMContext &Context, std::vector<EVT> &MemOps,
121 unsigned Limit, const MemOp &Op, unsigned DstAS,
122 unsigned SrcAS,
123 const AttributeList &FuncAttributes,
124 EVT *LargestVT = nullptr) const override;
125 EVT getOptimalMemOpType(LLVMContext &Context, const MemOp &Op,
126 const AttributeList &FuncAttributes) const override;
127 bool isTruncateFree(Type *, Type *) const override;
128 bool isTruncateFree(EVT, EVT) const override;
129
130 bool shouldFormOverflowOp(unsigned Opcode, EVT VT,
131 bool MathUsed) const override {
132 // Form add and sub with overflow intrinsics regardless of any extra
133 // users of the math result.
134 return VT == MVT::i32 || VT == MVT::i64 || VT == MVT::i128;
135 }
136
137 bool shouldConsiderGEPOffsetSplit() const override { return true; }
138
139 bool preferSelectsOverBooleanArithmetic(EVT VT) const override {
140 return true;
141 }
142
143 bool isProfitableToCombineMinNumMaxNum(EVT VT) const override {
144 // We have instructions for pseudo min/max, no need to convert them to
145 // minnum/maxnum.
146 return false;
147 }
148
149 // This function currently returns cost for srl/ipm/cc sequence for merging.
150 CondMergingParams
152 const Value *Rhs,
153 const Function *F) const override;
154
155 // Handle Lowering flag assembly outputs.
157 const SDLoc &DL,
158 const AsmOperandInfo &Constraint,
159 SelectionDAG &DAG) const override;
160
161 std::pair<unsigned, const TargetRegisterClass *>
163 StringRef Constraint, MVT VT) const override;
165 getConstraintType(StringRef Constraint) const override;
167 getSingleConstraintMatchWeight(AsmOperandInfo &info,
168 const char *constraint) const override;
170 std::vector<SDValue> &Ops,
171 SelectionDAG &DAG) const override;
172
174 getInlineAsmMemConstraint(StringRef ConstraintCode) const override {
175 if (ConstraintCode.size() == 1) {
176 switch(ConstraintCode[0]) {
177 default:
178 break;
179 case 'o':
181 case 'Q':
183 case 'R':
185 case 'S':
187 case 'T':
189 }
190 } else if (ConstraintCode.size() == 2 && ConstraintCode[0] == 'Z') {
191 switch (ConstraintCode[1]) {
192 default:
193 break;
194 case 'Q':
196 case 'R':
198 case 'S':
200 case 'T':
202 }
203 }
204 return TargetLowering::getInlineAsmMemConstraint(ConstraintCode);
205 }
206
207 Register getRegisterByName(const char *RegName, LLT VT,
208 const MachineFunction &MF) const override;
209
210 /// If a physical register, this returns the register that receives the
211 /// exception address on entry to an EH pad.
214 const Constant *PersonalityFn) const override;
215
216 /// If a physical register, this returns the register that receives the
217 /// exception typeid on entry to a landing pad.
220 const Constant *PersonalityFn) const override;
221
222 /// Override to support customized stack guard loading.
223 bool useLoadStackGuardNode(const Module &M) const override { return true; }
224 /// Insert SSP declaration if global stack protector is used.
225 void
227 const LibcallLoweringInfo &Libcalls) const override;
230 MachineBasicBlock *BB) const override;
231 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
233 SelectionDAG &DAG) const override;
235 SelectionDAG &DAG) const override;
236 const MCPhysReg *getScratchRegisters(CallingConv::ID CC) const override;
237 bool allowTruncateForTailCall(Type *, Type *) const override;
238 bool mayBeEmittedAsTailCall(const CallInst *CI) const override;
240 SelectionDAG & DAG, const SDLoc &DL, SDValue Val, SDValue *Parts,
241 unsigned NumParts, MVT PartVT, std::optional<CallingConv::ID> CC)
242 const override;
244 SelectionDAG & DAG, const SDLoc &DL, const SDValue *Parts,
245 unsigned NumParts, MVT PartVT, EVT ValueVT,
246 std::optional<CallingConv::ID> CC) const override;
248 bool isVarArg,
250 const SDLoc &DL, SelectionDAG &DAG,
251 SmallVectorImpl<SDValue> &InVals) const override;
252 SDValue LowerCall(CallLoweringInfo &CLI,
253 SmallVectorImpl<SDValue> &InVals) const override;
254
255 std::pair<SDValue, SDValue>
256 makeExternalCall(SDValue Chain, SelectionDAG &DAG, const char *CalleeName,
257 EVT RetVT, ArrayRef<SDValue> Ops, CallingConv::ID CallConv,
258 bool IsSigned, SDLoc DL, bool DoesNotReturn,
259 bool IsReturnValueUsed) const;
260
261 SDValue useLibCall(SelectionDAG &DAG, RTLIB::Libcall LC, MVT VT, SDValue Arg,
262 SDLoc DL, SDValue Chain, bool IsStrict) const;
263
265 bool isVarArg,
267 LLVMContext &Context,
268 const Type *RetTy) const override;
269 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool IsVarArg,
271 const SmallVectorImpl<SDValue> &OutVals, const SDLoc &DL,
272 SelectionDAG &DAG) const override;
273 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
274
275 /// Determine which of the bits specified in Mask are known to be either
276 /// zero or one and return them in the KnownZero/KnownOne bitsets.
279 const APInt &DemandedElts,
280 const SelectionDAG &DAG,
281 unsigned Depth = 0) const override;
282
283 /// Determine the number of bits in the operation that are sign bits.
285 const APInt &DemandedElts,
286 const SelectionDAG &DAG,
287 unsigned Depth) const override;
288
290 SDValue Op, const APInt &DemandedElts, const SelectionDAG &DAG,
291 UndefPoisonKind Kind, unsigned Depth) const override;
292
294 return ISD::ANY_EXTEND;
295 }
297 return ISD::ZERO_EXTEND;
298 }
299
300 bool supportSwiftError() const override {
301 return true;
302 }
303
304 unsigned getStackProbeSize(const MachineFunction &MF) const;
305 bool hasAndNot(SDValue Y) const override;
306
307private:
308 const SystemZSubtarget &Subtarget;
309
310 // Implement LowerOperation for individual opcodes.
311 SDValue getVectorCmp(SelectionDAG &DAG, unsigned Opcode,
312 const SDLoc &DL, EVT VT,
313 SDValue CmpOp0, SDValue CmpOp1, SDValue Chain) const;
314 SDValue lowerVectorSETCC(SelectionDAG &DAG, const SDLoc &DL,
315 EVT VT, ISD::CondCode CC,
316 SDValue CmpOp0, SDValue CmpOp1,
317 SDValue Chain = SDValue(),
318 bool IsSignaling = false) const;
319 SDValue lowerSETCC(SDValue Op, SelectionDAG &DAG) const;
320 SDValue lowerSTRICT_FSETCC(SDValue Op, SelectionDAG &DAG,
321 bool IsSignaling) const;
322 SDValue lowerBR_CC(SDValue Op, SelectionDAG &DAG) const;
323 SDValue lowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const;
324 SDValue lowerGlobalAddress(GlobalAddressSDNode *Node,
325 SelectionDAG &DAG) const;
326 SDValue lowerTLSGetOffset(GlobalAddressSDNode *Node,
327 SelectionDAG &DAG, unsigned Opcode,
328 SDValue GOTOffset) const;
329 SDValue lowerThreadPointer(const SDLoc &DL, SelectionDAG &DAG) const;
330 SDValue lowerGlobalTLSAddress(GlobalAddressSDNode *Node,
331 SelectionDAG &DAG) const;
332 SDValue lowerBlockAddress(BlockAddressSDNode *Node,
333 SelectionDAG &DAG) const;
334 SDValue lowerJumpTable(JumpTableSDNode *JT, SelectionDAG &DAG) const;
335 SDValue lowerConstantPool(ConstantPoolSDNode *CP, SelectionDAG &DAG) const;
338 SDValue lowerVASTART(SDValue Op, SelectionDAG &DAG) const;
339 SDValue lowerVASTART_ELF(SDValue Op, SelectionDAG &DAG) const;
340 SDValue lowerVASTART_XPLINK(SDValue Op, SelectionDAG &DAG) const;
341 SDValue lowerVACOPY(SDValue Op, SelectionDAG &DAG) const;
342 SDValue lowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const;
343 SDValue lowerDYNAMIC_STACKALLOC_ELF(SDValue Op, SelectionDAG &DAG) const;
344 SDValue lowerDYNAMIC_STACKALLOC_XPLINK(SDValue Op, SelectionDAG &DAG) const;
345 SDValue lowerGET_DYNAMIC_AREA_OFFSET(SDValue Op, SelectionDAG &DAG) const;
346 SDValue lowerMULH(SDValue Op, SelectionDAG &DAG, unsigned Opcode) const;
347 SDValue lowerSMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
348 SDValue lowerUMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
349 SDValue lowerSDIVREM(SDValue Op, SelectionDAG &DAG) const;
350 SDValue lowerUDIVREM(SDValue Op, SelectionDAG &DAG) const;
351 SDValue lowerXALUO(SDValue Op, SelectionDAG &DAG) const;
352 SDValue lowerUADDSUBO_CARRY(SDValue Op, SelectionDAG &DAG) const;
353 SDValue lowerBITCAST(SDValue Op, SelectionDAG &DAG) const;
354 SDValue lowerOR(SDValue Op, SelectionDAG &DAG) const;
355 SDValue lowerCTPOP(SDValue Op, SelectionDAG &DAG) const;
356 SDValue lowerVECREDUCE_ADD(SDValue Op, SelectionDAG &DAG) const;
357 SDValue lowerATOMIC_FENCE(SDValue Op, SelectionDAG &DAG) const;
358 SDValue lowerATOMIC_LOAD(SDValue Op, SelectionDAG &DAG) const;
359 SDValue lowerATOMIC_STORE(SDValue Op, SelectionDAG &DAG) const;
360 SDValue lowerATOMIC_LDST_I128(SDValue Op, SelectionDAG &DAG) const;
361 SDValue lowerATOMIC_LOAD_OP(SDValue Op, SelectionDAG &DAG,
362 unsigned Opcode) const;
363 SDValue lowerATOMIC_LOAD_SUB(SDValue Op, SelectionDAG &DAG) const;
364 SDValue lowerATOMIC_CMP_SWAP(SDValue Op, SelectionDAG &DAG) const;
365 SDValue lowerSTACKSAVE(SDValue Op, SelectionDAG &DAG) const;
366 SDValue lowerSTACKRESTORE(SDValue Op, SelectionDAG &DAG) const;
367 SDValue lowerPREFETCH(SDValue Op, SelectionDAG &DAG) const;
368 SDValue lowerINTRINSIC_W_CHAIN(SDValue Op, SelectionDAG &DAG) const;
369 SDValue lowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
370 bool isVectorElementLoad(SDValue Op) const;
371 SDValue buildVector(SelectionDAG &DAG, const SDLoc &DL, EVT VT,
372 SmallVectorImpl<SDValue> &Elems) const;
375 SDValue lowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG) const;
376 SDValue lowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
377 SDValue lowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
378 SDValue lowerSIGN_EXTEND_VECTOR_INREG(SDValue Op, SelectionDAG &DAG) const;
379 SDValue lowerZERO_EXTEND_VECTOR_INREG(SDValue Op, SelectionDAG &DAG) const;
380 SDValue lowerShift(SDValue Op, SelectionDAG &DAG, unsigned ByScalar) const;
381 SDValue lowerFSHL(SDValue Op, SelectionDAG &DAG) const;
382 SDValue lowerFSHR(SDValue Op, SelectionDAG &DAG) const;
383 SDValue lowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const;
384 SDValue lower_FP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
385 SDValue lower_INT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
386 SDValue lowerLoadF16(SDValue Op, SelectionDAG &DAG) const;
387 SDValue lowerStoreF16(SDValue Op, SelectionDAG &DAG) const;
388
389 SDValue lowerIS_FPCLASS(SDValue Op, SelectionDAG &DAG) const;
390 SDValue lowerGET_ROUNDING(SDValue Op, SelectionDAG &DAG) const;
391 SDValue lowerREADCYCLECOUNTER(SDValue Op, SelectionDAG &DAG) const;
392
393 bool canTreatAsByteVector(EVT VT) const;
394 SDValue combineExtract(const SDLoc &DL, EVT ElemVT, EVT VecVT, SDValue OrigOp,
395 unsigned Index, DAGCombinerInfo &DCI,
396 bool Force) const;
397 SDValue combineTruncateExtract(const SDLoc &DL, EVT TruncVT, SDValue Op,
398 DAGCombinerInfo &DCI) const;
399 SDValue combineZERO_EXTEND(SDNode *N, DAGCombinerInfo &DCI) const;
400 SDValue combineSIGN_EXTEND(SDNode *N, DAGCombinerInfo &DCI) const;
401 SDValue combineSIGN_EXTEND_INREG(SDNode *N, DAGCombinerInfo &DCI) const;
402 SDValue combineMERGE(SDNode *N, DAGCombinerInfo &DCI) const;
403 bool canLoadStoreByteSwapped(EVT VT) const;
404 SDValue combineLOAD(SDNode *N, DAGCombinerInfo &DCI) const;
405 SDValue combineSTORE(SDNode *N, DAGCombinerInfo &DCI) const;
406 SDValue combineVECTOR_SHUFFLE(SDNode *N, DAGCombinerInfo &DCI) const;
407 SDValue combineEXTRACT_VECTOR_ELT(SDNode *N, DAGCombinerInfo &DCI) const;
408 SDValue combineJOIN_DWORDS(SDNode *N, DAGCombinerInfo &DCI) const;
409 SDValue combineFP_ROUND(SDNode *N, DAGCombinerInfo &DCI) const;
410 SDValue combineFP_EXTEND(SDNode *N, DAGCombinerInfo &DCI) const;
411 SDValue combineINT_TO_FP(SDNode *N, DAGCombinerInfo &DCI) const;
412 SDValue combineFCOPYSIGN(SDNode *N, DAGCombinerInfo &DCI) const;
413 SDValue combineBSWAP(SDNode *N, DAGCombinerInfo &DCI) const;
414 SDValue combineSETCC(SDNode *N, DAGCombinerInfo &DCI) const;
415 SDValue combineBR_CCMASK(SDNode *N, DAGCombinerInfo &DCI) const;
416 SDValue combineSELECT_CCMASK(SDNode *N, DAGCombinerInfo &DCI) const;
417 SDValue combineGET_CCMASK(SDNode *N, DAGCombinerInfo &DCI) const;
418 SDValue combineShiftToMulAddHigh(SDNode *N, DAGCombinerInfo &DCI) const;
419 SDValue combineMUL(SDNode *N, DAGCombinerInfo &DCI) const;
420 SDValue combineIntDIVREM(SDNode *N, DAGCombinerInfo &DCI) const;
421 SDValue combineINTRINSIC(SDNode *N, DAGCombinerInfo &DCI) const;
422
423 SDValue unwrapAddress(SDValue N) const override;
424
425 // Implement EmitInstrWithCustomInserter for individual operation types.
426 MachineBasicBlock *emitAdjCallStack(MachineInstr &MI,
427 MachineBasicBlock *BB) const;
430 unsigned StoreOpcode, unsigned STOCOpcode,
431 bool Invert) const;
433 bool Unsigned) const;
434 MachineBasicBlock *emitAtomicLoadBinary(MachineInstr &MI,
436 unsigned BinOpcode,
437 bool Invert = false) const;
438 MachineBasicBlock *emitAtomicLoadMinMax(MachineInstr &MI,
440 unsigned CompareOpcode,
441 unsigned KeepOldMask) const;
442 MachineBasicBlock *emitAtomicCmpSwapW(MachineInstr &MI,
443 MachineBasicBlock *BB) const;
444 MachineBasicBlock *emitMemMemWrapper(MachineInstr &MI, MachineBasicBlock *BB,
445 unsigned Opcode,
446 bool IsMemset = false) const;
447 MachineBasicBlock *emitMemmoveImm(MachineInstr &MI,
448 MachineBasicBlock *BB) const;
449 MachineBasicBlock *emitStringWrapper(MachineInstr &MI, MachineBasicBlock *BB,
450 unsigned Opcode) const;
451 MachineBasicBlock *emitTransactionBegin(MachineInstr &MI,
453 unsigned Opcode, bool NoFloat) const;
454 MachineBasicBlock *emitLoadAndTestCmp0(MachineInstr &MI,
456 unsigned Opcode) const;
457 MachineBasicBlock *emitProbedAlloca(MachineInstr &MI,
458 MachineBasicBlock *MBB) const;
459 MachineBasicBlock *emitStackGuardPseudo(MachineInstr &MI,
461 unsigned PseudoOp) const;
462 SDValue getBackchainAddress(SDValue SP, SelectionDAG &DAG) const;
463
465 getTargetMMOFlags(const Instruction &I) const override;
466
467private:
468 bool enableNarrowIntArgsVerification() const;
469 bool isInternal(const Function *Fn) const;
470 mutable std::map<const Function *, bool> IsInternalCache;
471 void verifyNarrowIntegerArgs_Call(CallLoweringInfo &CLI,
473 const Function *F, SDValue Callee) const;
474 void verifyNarrowIntegerArgs_Ret(CallingConv::ID CallConv,
476 const Function *F) const;
477 bool verifyNarrowIntegerArgs(bool C_ABI,
479 const Function *FunHeader, bool IsRet) const;
480
481public:
482};
483
485private:
486 APInt IntBits; // The 128 bits as an integer.
487 APInt SplatBits; // Smallest splat value.
488 APInt SplatUndef; // Bits correspoding to undef operands of the BVN.
489 unsigned SplatBitSize = 0;
490 bool isFP128 = false;
491public:
492 unsigned Opcode = 0;
497 : SystemZVectorConstantInfo(FPImm.bitcastToAPInt()) {
498 isFP128 = (&FPImm.getSemantics() == &APFloat::IEEEquad());
499 }
501 bool isVectorConstantLegal(const SystemZSubtarget &Subtarget);
502};
503
504} // end namespace llvm
505
506#endif
uint64_t Imm
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Function Alias Analysis Results
IRTranslator LLVM IR MI
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define RegName(no)
lazy value info
static SDValue combineFP_ROUND(SDValue N, const SDLoc &DL, SelectionDAG &DAG, const LoongArchSubtarget &Subtarget)
#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 MachineBasicBlock * emitSelect(MachineInstr &MI, MachineBasicBlock *BB, const TargetInstrInfo *TII, const PPCSubtarget &Subtarget)
Emit SELECT instruction, using ISEL if available, otherwise use branch-based control flow.
static SDValue lowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG, const RISCVSubtarget &Subtarget)
RISCVCC::CondCode CC
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 lowerVECTOR_SHUFFLE(SDValue Op, const X86Subtarget &Subtarget, SelectionDAG &DAG)
Top-level lowering for x86 vector shuffles.
static const fltSemantics & IEEEquad()
Definition APFloat.h:306
const fltSemantics & getSemantics() const
Definition APFloat.h:1591
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
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:44
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:76
Tracks which library functions to use for a particular subtarget or function.
An instruction for reading from memory.
Machine Value Type.
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: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.
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.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
constexpr size_t size() const
Get the string size.
Definition StringRef.h:144
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.
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...
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
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...
bool canMergeStoresTo(unsigned AS, EVT MemVT, const MachineFunction &MF) const override
Returns if it's reasonable to merge stores to MemVT size.
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
void insertSSPDeclarations(Module &M, const LibcallLoweringInfo &Libcalls) const override
Insert SSP declaration if global stack protector is used.
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.
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 ...
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.
FPImmAction getFPImmAction(const APFloat &Imm, EVT VT, bool ForCodeSize) const override
Returns how the legalizer should materialize the specified FP immediate.
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 ...
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...
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...
CondMergingParams getJumpConditionMergingParams(Instruction::BinaryOps Opc, const Value *Lhs, const Value *Rhs, const Function *F) const override
TargetLoweringBase::LegalizeTypeAction getPreferredVectorAction(MVT VT) const override
Return the preferred vector type legalization action.
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.
bool isProfitableToCombineMinNumMaxNum(EVT VT) const override
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.
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 ...
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...
MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override
Return the type to use for a scalar shift opcode, given the shifted amount type.
bool aggressivelyPreferBuildVectorSources(EVT VecVT) const override
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,...
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.
FPImmAction
How the legalizer should materialize a floating-point immediate.
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...
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
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
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
Definition ISDOpcodes.h:43
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition ISDOpcodes.h:879
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
Definition ISDOpcodes.h:876
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.
@ Known
Known to have no common set bits.
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
@ Fast
Assign the register banks as fast as possible (default).
DWARFExpression::Operation Op
ExceptionHandling
Definition CodeGen.h:54
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 isScalarInteger() const
Return true if this is an integer, but not a vector.
Definition ValueTypes.h:165
SmallVector< unsigned, 2 > OpVals
bool isVectorConstantLegal(const SystemZSubtarget &Subtarget)