LLVM 20.0.0git
NVPTXISelLowering.h
Go to the documentation of this file.
1//===-- NVPTXISelLowering.h - NVPTX 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 NVPTX uses to lower LLVM code into a
10// selection DAG.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_NVPTX_NVPTXISELLOWERING_H
15#define LLVM_LIB_TARGET_NVPTX_NVPTXISELLOWERING_H
16
17#include "NVPTX.h"
20
21namespace llvm {
22namespace NVPTXISD {
23enum NodeType : unsigned {
24 // Start the numbering from where ISD NodeType finishes.
72
75 LDUV2, // LDU.v2
76 LDUV4, // LDU.v4
85 StoreParamS32, // to sext and store a <32bit value, not used currently
86 StoreParamU32, // to zext and store a <32bit value, not used currently
90};
91}
92
93class NVPTXSubtarget;
94
95//===--------------------------------------------------------------------===//
96// TargetLowering Implementation
97//===--------------------------------------------------------------------===//
99public:
100 explicit NVPTXTargetLowering(const NVPTXTargetMachine &TM,
101 const NVPTXSubtarget &STI);
102 SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
103
105
106 const char *getTargetNodeName(unsigned Opcode) const override;
107
109 MachineFunction &MF,
110 unsigned Intrinsic) const override;
111
112 Align getFunctionArgumentAlignment(const Function *F, Type *Ty, unsigned Idx,
113 const DataLayout &DL) const;
114
115 /// getFunctionParamOptimizedAlign - since function arguments are passed via
116 /// .param space, we may want to increase their alignment in a way that
117 /// ensures that we can effectively vectorize their loads & stores. We can
118 /// increase alignment only if the function has internal or has private
119 /// linkage as for other linkage types callers may already rely on default
120 /// alignment. To allow using 128-bit vectorized loads/stores, this function
121 /// ensures that alignment is 16 or greater.
123 const DataLayout &DL) const;
124
125 /// Helper for computing alignment of a device function byval parameter.
127 Align InitialAlign,
128 const DataLayout &DL) const;
129
130 // Helper for getting a function parameter name. Name is composed from
131 // its index and the function name. Negative index corresponds to special
132 // parameter (unsized array) used for passing variable arguments.
133 std::string getParamName(const Function *F, int Idx) const;
134
135 /// isLegalAddressingMode - Return true if the addressing mode represented
136 /// by AM is legal for this target, for a load/store of the specified type
137 /// Used to guide target specific optimizations, like loop strength
138 /// reduction (LoopStrengthReduce.cpp) and memory optimization for
139 /// address mode (CodeGenPrepare.cpp)
140 bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty,
141 unsigned AS,
142 Instruction *I = nullptr) const override;
143
144 bool isTruncateFree(Type *SrcTy, Type *DstTy) const override {
145 // Truncating 64-bit to 32-bit is free in SASS.
146 if (!SrcTy->isIntegerTy() || !DstTy->isIntegerTy())
147 return false;
148 return SrcTy->getPrimitiveSizeInBits() == 64 &&
149 DstTy->getPrimitiveSizeInBits() == 32;
150 }
151
153 EVT VT) const override {
154 if (VT.isVector())
155 return EVT::getVectorVT(Ctx, MVT::i1, VT.getVectorNumElements());
156 return MVT::i1;
157 }
158
159 ConstraintType getConstraintType(StringRef Constraint) const override;
160 std::pair<unsigned, const TargetRegisterClass *>
162 StringRef Constraint, MVT VT) const override;
163
165 bool isVarArg,
167 const SDLoc &dl, SelectionDAG &DAG,
168 SmallVectorImpl<SDValue> &InVals) const override;
169
170 SDValue LowerCall(CallLoweringInfo &CLI,
171 SmallVectorImpl<SDValue> &InVals) const override;
172
176
177 std::string
178 getPrototype(const DataLayout &DL, Type *, const ArgListTy &,
179 const SmallVectorImpl<ISD::OutputArg> &, MaybeAlign retAlignment,
180 std::optional<std::pair<unsigned, const APInt &>> VAInfo,
181 const CallBase &CB, unsigned UniqueCallSite) const;
182
183 SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
185 const SmallVectorImpl<SDValue> &OutVals, const SDLoc &dl,
186 SelectionDAG &DAG) const override;
187
189 std::vector<SDValue> &Ops,
190 SelectionDAG &DAG) const override;
191
193
194 // PTX always uses 32-bit shift amounts
195 MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override {
196 return MVT::i32;
197 }
198
200 getPreferredVectorAction(MVT VT) const override;
201
202 // Get the degree of precision we want from 32-bit floating point division
203 // operations.
204 //
205 // 0 - Use ptx div.approx
206 // 1 - Use ptx.div.full (approximate, but less so than div.approx)
207 // 2 - Use IEEE-compliant div instructions, if available.
208 int getDivF32Level() const;
209
210 // Get whether we should use a precise or approximate 32-bit floating point
211 // sqrt instruction.
212 bool usePrecSqrtF32() const;
213
214 // Get whether we should use instructions that flush floating-point denormals
215 // to sign-preserving zero.
216 bool useF32FTZ(const MachineFunction &MF) const;
217
219 int &ExtraSteps, bool &UseOneConst,
220 bool Reciprocal) const override;
221
222 unsigned combineRepeatedFPDivisors() const override { return 2; }
223
224 bool allowFMA(MachineFunction &MF, CodeGenOptLevel OptLevel) const;
225 bool allowUnsafeFPMath(MachineFunction &MF) const;
226
228 EVT) const override {
229 return true;
230 }
231
232 // The default is the same as pointer type, but brx.idx only accepts i32
233 MVT getJumpTableRegTy(const DataLayout &) const override { return MVT::i32; }
234
235 unsigned getJumpTableEncoding() const override;
236
237 bool enableAggressiveFMAFusion(EVT VT) const override { return true; }
238
239 // The default is to transform llvm.ctlz(x, false) (where false indicates that
240 // x == 0 is not undefined behavior) into a branch that checks whether x is 0
241 // and avoids calling ctlz in that case. We have a dedicated ctlz
242 // instruction, so we say that ctlz is cheap to speculate.
243 bool isCheapToSpeculateCtlz(Type *Ty) const override { return true; }
244
247 }
248
251 }
252
254 shouldExpandAtomicRMWInIR(AtomicRMWInst *AI) const override;
255
256 bool aggressivelyPreferBuildVectorSources(EVT VecVT) const override {
257 // There's rarely any point of packing something into a vector type if we
258 // already have the source data.
259 return true;
260 }
261
262private:
263 const NVPTXSubtarget &STI; // cache the subtarget here
264 SDValue getParamSymbol(SelectionDAG &DAG, int idx, EVT) const;
265
266 SDValue LowerBITCAST(SDValue Op, SelectionDAG &DAG) const;
267
268 SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
269 SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
270 SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
271 SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
272 SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const;
273
274 SDValue LowerFCOPYSIGN(SDValue Op, SelectionDAG &DAG) const;
275
276 SDValue LowerFROUND(SDValue Op, SelectionDAG &DAG) const;
277 SDValue LowerFROUND32(SDValue Op, SelectionDAG &DAG) const;
278 SDValue LowerFROUND64(SDValue Op, SelectionDAG &DAG) const;
279
280 SDValue LowerINT_TO_FP(SDValue Op, SelectionDAG &DAG) const;
281 SDValue LowerFP_TO_INT(SDValue Op, SelectionDAG &DAG) const;
282
283 SDValue LowerFP_ROUND(SDValue Op, SelectionDAG &DAG) const;
284 SDValue LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const;
285
286 SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
287 SDValue LowerLOADi1(SDValue Op, SelectionDAG &DAG) const;
288
289 SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
290 SDValue LowerSTOREi1(SDValue Op, SelectionDAG &DAG) const;
291 SDValue LowerSTOREVector(SDValue Op, SelectionDAG &DAG) const;
292
293 SDValue LowerShiftRightParts(SDValue Op, SelectionDAG &DAG) const;
294 SDValue LowerShiftLeftParts(SDValue Op, SelectionDAG &DAG) const;
295
296 SDValue LowerSelect(SDValue Op, SelectionDAG &DAG) const;
297
298 SDValue LowerBR_JT(SDValue Op, SelectionDAG &DAG) const;
299
300 SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const;
301 SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
302
303 SDValue LowerCopyToReg_128(SDValue Op, SelectionDAG &DAG) const;
304 unsigned getNumRegisters(LLVMContext &Context, EVT VT,
305 std::optional<MVT> RegisterVT) const override;
306 bool
307 splitValueIntoRegisterParts(SelectionDAG &DAG, const SDLoc &DL, SDValue Val,
308 SDValue *Parts, unsigned NumParts, MVT PartVT,
309 std::optional<CallingConv::ID> CC) const override;
310
311 void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
312 SelectionDAG &DAG) const override;
313 SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
314
315 Align getArgumentAlignment(const CallBase *CB, Type *Ty, unsigned Idx,
316 const DataLayout &DL) const;
317};
318
319} // namespace llvm
320
321#endif
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Function Alias Analysis Results
Analysis containing CSE Info
Definition: CSEInfo.cpp:27
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
unsigned const TargetRegisterInfo * TRI
This file describes how to lower LLVM code to machine code.
an instruction that atomically reads a memory location, combines it with another value,...
Definition: Instructions.h:704
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Definition: InstrTypes.h:1120
This class represents a function call, abstracting a target machine's calling convention.
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:63
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:67
An instruction for reading from memory.
Definition: Instructions.h:176
Machine Value Type.
bool enableAggressiveFMAFusion(EVT VT) const override
Return true if target always benefits from combining into FMA for a given value type.
ConstraintType getConstraintType(StringRef Constraint) const override
getConstraintType - Given a constraint letter, return the type of constraint it is for this target.
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...
const NVPTXTargetMachine * nvTM
SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const
MVT getJumpTableRegTy(const DataLayout &) const override
bool useF32FTZ(const MachineFunction &MF) const
SDValue LowerSTACKSAVE(SDValue Op, SelectionDAG &DAG) const
unsigned combineRepeatedFPDivisors() const override
Indicate whether this target prefers to combine FDIVs with the same divisor.
Align getFunctionArgumentAlignment(const Function *F, Type *Ty, unsigned Idx, const DataLayout &DL) const
SDValue getSqrtEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled, int &ExtraSteps, bool &UseOneConst, bool Reciprocal) const override
Hooks for building estimates in place of slower divisions and square roots.
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,...
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,...
AtomicExpansionKind shouldCastAtomicLoadInIR(LoadInst *LI) const override
Returns how the given (atomic) load should be cast by the IR-level AtomicExpand pass.
AtomicExpansionKind shouldCastAtomicStoreInIR(StoreInst *SI) const override
Returns how the given (atomic) store should be cast by the IR-level AtomicExpand pass into.
void LowerAsmOperandForConstraint(SDValue Op, StringRef Constraint, std::vector< SDValue > &Ops, SelectionDAG &DAG) const override
Lower the specified operand into the Ops vector.
SDValue LowerSTACKRESTORE(SDValue Op, SelectionDAG &DAG) const
bool aggressivelyPreferBuildVectorSources(EVT VecVT) const override
bool isTruncateFree(Type *SrcTy, Type *DstTy) const override
Return true if it's free to truncate a value of type FromTy to type ToTy.
std::string getParamName(const Function *F, int Idx) const
TargetLoweringBase::LegalizeTypeAction getPreferredVectorAction(MVT VT) const override
Return the preferred vector type legalization action.
std::string getPrototype(const DataLayout &DL, Type *, const ArgListTy &, const SmallVectorImpl< ISD::OutputArg > &, MaybeAlign retAlignment, std::optional< std::pair< unsigned, const APInt & > > VAInfo, const CallBase &CB, unsigned UniqueCallSite) const
Align getFunctionParamOptimizedAlign(const Function *F, Type *ArgTy, const DataLayout &DL) const
getFunctionParamOptimizedAlign - since function arguments are passed via .param space,...
SDValue LowerDYNAMIC_STACKALLOC(SDValue Op, SelectionDAG &DAG) const
MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override
Return the type to use for a scalar shift opcode, given the shifted amount type.
EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Ctx, EVT VT) const override
Return the ValueType of the result of SETCC operations.
std::pair< unsigned, const TargetRegisterClass * > getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI, StringRef Constraint, MVT VT) const override
Given a physical register constraint (e.g.
bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty, unsigned AS, Instruction *I=nullptr) const override
isLegalAddressingMode - Return true if the addressing mode represented by AM is legal for this target...
AtomicExpansionKind shouldExpandAtomicRMWInIR(AtomicRMWInst *AI) const override
Returns how the IR-level AtomicExpand pass should expand the given AtomicRMW, if at all.
bool isCheapToSpeculateCtlz(Type *Ty) const override
Return true if it is cheap to speculate a call to intrinsic ctlz.
Align getFunctionByValParamAlign(const Function *F, Type *ArgTy, Align InitialAlign, const DataLayout &DL) const
Helper for computing alignment of a device function byval parameter.
bool getTgtMemIntrinsic(IntrinsicInfo &Info, const CallInst &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...
const char * getTargetNodeName(unsigned Opcode) const override
This method returns the name of a target specific DAG node.
bool allowFMA(MachineFunction &MF, CodeGenOptLevel OptLevel) const
unsigned getJumpTableEncoding() const override
Return the entry encoding for a jump table in the current function.
bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF, EVT) const override
Return true if an FMA operation is faster than a pair of fmul and fadd instructions.
bool allowUnsafeFPMath(MachineFunction &MF) const
SDValue LowerCall(CallLoweringInfo &CLI, SmallVectorImpl< SDValue > &InVals) const override
This hook must be implemented to lower calls into the specified DAG.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
Definition: SelectionDAG.h:228
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:573
An instruction for storing to memory.
Definition: Instructions.h:292
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
LegalizeTypeAction
This enum indicates whether a types are legal for a target, and if not, what action should be used to...
AtomicExpansionKind
Enum that specifies what an atomic load/AtomicRMWInst is expanded to, if at all.
std::vector< ArgListEntry > ArgListTy
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
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:45
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition: Type.h:237
TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
@ BUILTIN_OP_END
BUILTIN_OP_END - This must be the last enum value in this list.
Definition: ISDOpcodes.h:1490
static const int FIRST_TARGET_MEMORY_OPCODE
FIRST_TARGET_MEMORY_OPCODE - Target-specific pre-isel operations which do not reference a specific me...
Definition: ISDOpcodes.h:1502
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
CodeGenOptLevel
Code generation optimization level.
Definition: CodeGen.h:54
#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
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
Definition: ValueTypes.h:74
bool isVector() const
Return true if this is a vector value type.
Definition: ValueTypes.h:168
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
Definition: ValueTypes.h:331
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
Definition: Alignment.h:117
This represents an addressing mode of: BaseGV + BaseOffs + BaseReg + Scale*ScaleReg + ScalableOffset*...