NVPTXISelLowering.h revision dce4a407a24b04eebc6a376f8e62b41aaa7b071f
1//===-- NVPTXISelLowering.h - NVPTX DAG Lowering Interface ------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the interfaces that NVPTX uses to lower LLVM code into a
11// selection DAG.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef NVPTXISELLOWERING_H
16#define NVPTXISELLOWERING_H
17
18#include "NVPTX.h"
19#include "NVPTXSubtarget.h"
20#include "llvm/CodeGen/SelectionDAG.h"
21#include "llvm/Target/TargetLowering.h"
22
23namespace llvm {
24namespace NVPTXISD {
25enum NodeType {
26  // Start the numbering from where ISD NodeType finishes.
27  FIRST_NUMBER = ISD::BUILTIN_OP_END,
28  Wrapper,
29  CALL,
30  RET_FLAG,
31  LOAD_PARAM,
32  DeclareParam,
33  DeclareScalarParam,
34  DeclareRetParam,
35  DeclareRet,
36  DeclareScalarRet,
37  PrintCall,
38  PrintCallUni,
39  CallArgBegin,
40  CallArg,
41  LastCallArg,
42  CallArgEnd,
43  CallVoid,
44  CallVal,
45  CallSymbol,
46  Prototype,
47  MoveParam,
48  PseudoUseParam,
49  RETURN,
50  CallSeqBegin,
51  CallSeqEnd,
52  CallPrototype,
53  Dummy,
54
55  LoadV2 = ISD::FIRST_TARGET_MEMORY_OPCODE,
56  LoadV4,
57  LDGV2, // LDG.v2
58  LDGV4, // LDG.v4
59  LDUV2, // LDU.v2
60  LDUV4, // LDU.v4
61  StoreV2,
62  StoreV4,
63  LoadParam,
64  LoadParamV2,
65  LoadParamV4,
66  StoreParam,
67  StoreParamV2,
68  StoreParamV4,
69  StoreParamS32, // to sext and store a <32bit value, not used currently
70  StoreParamU32, // to zext and store a <32bit value, not used currently
71  StoreRetval,
72  StoreRetvalV2,
73  StoreRetvalV4,
74
75  // Texture intrinsics
76  Tex1DFloatI32,
77  Tex1DFloatFloat,
78  Tex1DFloatFloatLevel,
79  Tex1DFloatFloatGrad,
80  Tex1DI32I32,
81  Tex1DI32Float,
82  Tex1DI32FloatLevel,
83  Tex1DI32FloatGrad,
84  Tex1DArrayFloatI32,
85  Tex1DArrayFloatFloat,
86  Tex1DArrayFloatFloatLevel,
87  Tex1DArrayFloatFloatGrad,
88  Tex1DArrayI32I32,
89  Tex1DArrayI32Float,
90  Tex1DArrayI32FloatLevel,
91  Tex1DArrayI32FloatGrad,
92  Tex2DFloatI32,
93  Tex2DFloatFloat,
94  Tex2DFloatFloatLevel,
95  Tex2DFloatFloatGrad,
96  Tex2DI32I32,
97  Tex2DI32Float,
98  Tex2DI32FloatLevel,
99  Tex2DI32FloatGrad,
100  Tex2DArrayFloatI32,
101  Tex2DArrayFloatFloat,
102  Tex2DArrayFloatFloatLevel,
103  Tex2DArrayFloatFloatGrad,
104  Tex2DArrayI32I32,
105  Tex2DArrayI32Float,
106  Tex2DArrayI32FloatLevel,
107  Tex2DArrayI32FloatGrad,
108  Tex3DFloatI32,
109  Tex3DFloatFloat,
110  Tex3DFloatFloatLevel,
111  Tex3DFloatFloatGrad,
112  Tex3DI32I32,
113  Tex3DI32Float,
114  Tex3DI32FloatLevel,
115  Tex3DI32FloatGrad,
116
117  // Surface intrinsics
118  Suld1DI8Trap,
119  Suld1DI16Trap,
120  Suld1DI32Trap,
121  Suld1DV2I8Trap,
122  Suld1DV2I16Trap,
123  Suld1DV2I32Trap,
124  Suld1DV4I8Trap,
125  Suld1DV4I16Trap,
126  Suld1DV4I32Trap,
127
128  Suld1DArrayI8Trap,
129  Suld1DArrayI16Trap,
130  Suld1DArrayI32Trap,
131  Suld1DArrayV2I8Trap,
132  Suld1DArrayV2I16Trap,
133  Suld1DArrayV2I32Trap,
134  Suld1DArrayV4I8Trap,
135  Suld1DArrayV4I16Trap,
136  Suld1DArrayV4I32Trap,
137
138  Suld2DI8Trap,
139  Suld2DI16Trap,
140  Suld2DI32Trap,
141  Suld2DV2I8Trap,
142  Suld2DV2I16Trap,
143  Suld2DV2I32Trap,
144  Suld2DV4I8Trap,
145  Suld2DV4I16Trap,
146  Suld2DV4I32Trap,
147
148  Suld2DArrayI8Trap,
149  Suld2DArrayI16Trap,
150  Suld2DArrayI32Trap,
151  Suld2DArrayV2I8Trap,
152  Suld2DArrayV2I16Trap,
153  Suld2DArrayV2I32Trap,
154  Suld2DArrayV4I8Trap,
155  Suld2DArrayV4I16Trap,
156  Suld2DArrayV4I32Trap,
157
158  Suld3DI8Trap,
159  Suld3DI16Trap,
160  Suld3DI32Trap,
161  Suld3DV2I8Trap,
162  Suld3DV2I16Trap,
163  Suld3DV2I32Trap,
164  Suld3DV4I8Trap,
165  Suld3DV4I16Trap,
166  Suld3DV4I32Trap
167};
168}
169
170//===--------------------------------------------------------------------===//
171// TargetLowering Implementation
172//===--------------------------------------------------------------------===//
173class NVPTXTargetLowering : public TargetLowering {
174public:
175  explicit NVPTXTargetLowering(NVPTXTargetMachine &TM);
176  SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
177
178  SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
179  SDValue LowerGlobalAddress(const GlobalValue *GV, int64_t Offset,
180                             SelectionDAG &DAG) const;
181
182  const char *getTargetNodeName(unsigned Opcode) const override;
183
184  bool isTypeSupportedInIntrinsic(MVT VT) const;
185
186  bool getTgtMemIntrinsic(IntrinsicInfo &Info, const CallInst &I,
187                          unsigned Intrinsic) const override;
188
189  /// isLegalAddressingMode - Return true if the addressing mode represented
190  /// by AM is legal for this target, for a load/store of the specified type
191  /// Used to guide target specific optimizations, like loop strength
192  /// reduction (LoopStrengthReduce.cpp) and memory optimization for
193  /// address mode (CodeGenPrepare.cpp)
194  bool isLegalAddressingMode(const AddrMode &AM, Type *Ty) const override;
195
196  /// getFunctionAlignment - Return the Log2 alignment of this function.
197  unsigned getFunctionAlignment(const Function *F) const;
198
199  EVT getSetCCResultType(LLVMContext &, EVT VT) const override {
200    if (VT.isVector())
201      return MVT::getVectorVT(MVT::i1, VT.getVectorNumElements());
202    return MVT::i1;
203  }
204
205  ConstraintType
206  getConstraintType(const std::string &Constraint) const override;
207  std::pair<unsigned, const TargetRegisterClass *>
208  getRegForInlineAsmConstraint(const std::string &Constraint,
209                               MVT VT) const override;
210
211  SDValue LowerFormalArguments(
212      SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
213      const SmallVectorImpl<ISD::InputArg> &Ins, SDLoc dl, SelectionDAG &DAG,
214      SmallVectorImpl<SDValue> &InVals) const override;
215
216  SDValue LowerCall(CallLoweringInfo &CLI,
217                    SmallVectorImpl<SDValue> &InVals) const override;
218
219  std::string getPrototype(Type *, const ArgListTy &,
220                           const SmallVectorImpl<ISD::OutputArg> &,
221                           unsigned retAlignment,
222                           const ImmutableCallSite *CS) const;
223
224  SDValue
225  LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
226              const SmallVectorImpl<ISD::OutputArg> &Outs,
227              const SmallVectorImpl<SDValue> &OutVals, SDLoc dl,
228              SelectionDAG &DAG) const override;
229
230  void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint,
231                                    std::vector<SDValue> &Ops,
232                                    SelectionDAG &DAG) const override;
233
234  NVPTXTargetMachine *nvTM;
235
236  // PTX always uses 32-bit shift amounts
237  MVT getScalarShiftAmountTy(EVT LHSTy) const override { return MVT::i32; }
238
239  bool shouldSplitVectorType(EVT VT) const override;
240
241private:
242  const NVPTXSubtarget &nvptxSubtarget; // cache the subtarget here
243
244  SDValue getExtSymb(SelectionDAG &DAG, const char *name, int idx,
245                     EVT = MVT::i32) const;
246  SDValue getParamSymbol(SelectionDAG &DAG, int idx, EVT) const;
247  SDValue getParamHelpSymbol(SelectionDAG &DAG, int idx);
248
249  SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
250
251  SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
252  SDValue LowerLOADi1(SDValue Op, SelectionDAG &DAG) const;
253
254  SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
255  SDValue LowerSTOREi1(SDValue Op, SelectionDAG &DAG) const;
256  SDValue LowerSTOREVector(SDValue Op, SelectionDAG &DAG) const;
257
258  void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
259                          SelectionDAG &DAG) const override;
260
261  unsigned getArgumentAlignment(SDValue Callee, const ImmutableCallSite *CS,
262                                Type *Ty, unsigned Idx) const;
263};
264} // namespace llvm
265
266#endif // NVPTXISELLOWERING_H
267