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"
18 #include "llvm/CodeGen/SelectionDAG.h"
19 #include "llvm/CodeGen/TargetLowering.h"
20 
21 namespace llvm {
22 namespace NVPTXISD {
23 enum NodeType : unsigned {
24   // Start the numbering from where ISD NodeType finishes.
25   FIRST_NUMBER = ISD::BUILTIN_OP_END,
26   Wrapper,
27   CALL,
28   RET_GLUE,
29   LOAD_PARAM,
30   DeclareParam,
31   DeclareScalarParam,
32   DeclareRetParam,
33   DeclareRet,
34   DeclareScalarRet,
35   PrintCall,
36   PrintConvergentCall,
37   PrintCallUni,
38   PrintConvergentCallUni,
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   ProxyReg,
54   FUN_SHFL_CLAMP,
55   FUN_SHFR_CLAMP,
56   MUL_WIDE_SIGNED,
57   MUL_WIDE_UNSIGNED,
58   IMAD,
59   SETP_F16X2,
60   Dummy,
61 
62   LoadV2 = ISD::FIRST_TARGET_MEMORY_OPCODE,
63   LoadV4,
64   LDGV2, // LDG.v2
65   LDGV4, // LDG.v4
66   LDUV2, // LDU.v2
67   LDUV4, // LDU.v4
68   StoreV2,
69   StoreV4,
70   LoadParam,
71   LoadParamV2,
72   LoadParamV4,
73   StoreParam,
74   StoreParamV2,
75   StoreParamV4,
76   StoreParamS32, // to sext and store a <32bit value, not used currently
77   StoreParamU32, // to zext and store a <32bit value, not used currently
78   StoreRetval,
79   StoreRetvalV2,
80   StoreRetvalV4,
81 
82   // Texture intrinsics
83   Tex1DFloatS32,
84   Tex1DFloatFloat,
85   Tex1DFloatFloatLevel,
86   Tex1DFloatFloatGrad,
87   Tex1DS32S32,
88   Tex1DS32Float,
89   Tex1DS32FloatLevel,
90   Tex1DS32FloatGrad,
91   Tex1DU32S32,
92   Tex1DU32Float,
93   Tex1DU32FloatLevel,
94   Tex1DU32FloatGrad,
95   Tex1DArrayFloatS32,
96   Tex1DArrayFloatFloat,
97   Tex1DArrayFloatFloatLevel,
98   Tex1DArrayFloatFloatGrad,
99   Tex1DArrayS32S32,
100   Tex1DArrayS32Float,
101   Tex1DArrayS32FloatLevel,
102   Tex1DArrayS32FloatGrad,
103   Tex1DArrayU32S32,
104   Tex1DArrayU32Float,
105   Tex1DArrayU32FloatLevel,
106   Tex1DArrayU32FloatGrad,
107   Tex2DFloatS32,
108   Tex2DFloatFloat,
109   Tex2DFloatFloatLevel,
110   Tex2DFloatFloatGrad,
111   Tex2DS32S32,
112   Tex2DS32Float,
113   Tex2DS32FloatLevel,
114   Tex2DS32FloatGrad,
115   Tex2DU32S32,
116   Tex2DU32Float,
117   Tex2DU32FloatLevel,
118   Tex2DU32FloatGrad,
119   Tex2DArrayFloatS32,
120   Tex2DArrayFloatFloat,
121   Tex2DArrayFloatFloatLevel,
122   Tex2DArrayFloatFloatGrad,
123   Tex2DArrayS32S32,
124   Tex2DArrayS32Float,
125   Tex2DArrayS32FloatLevel,
126   Tex2DArrayS32FloatGrad,
127   Tex2DArrayU32S32,
128   Tex2DArrayU32Float,
129   Tex2DArrayU32FloatLevel,
130   Tex2DArrayU32FloatGrad,
131   Tex3DFloatS32,
132   Tex3DFloatFloat,
133   Tex3DFloatFloatLevel,
134   Tex3DFloatFloatGrad,
135   Tex3DS32S32,
136   Tex3DS32Float,
137   Tex3DS32FloatLevel,
138   Tex3DS32FloatGrad,
139   Tex3DU32S32,
140   Tex3DU32Float,
141   Tex3DU32FloatLevel,
142   Tex3DU32FloatGrad,
143   TexCubeFloatFloat,
144   TexCubeFloatFloatLevel,
145   TexCubeS32Float,
146   TexCubeS32FloatLevel,
147   TexCubeU32Float,
148   TexCubeU32FloatLevel,
149   TexCubeArrayFloatFloat,
150   TexCubeArrayFloatFloatLevel,
151   TexCubeArrayS32Float,
152   TexCubeArrayS32FloatLevel,
153   TexCubeArrayU32Float,
154   TexCubeArrayU32FloatLevel,
155   Tld4R2DFloatFloat,
156   Tld4G2DFloatFloat,
157   Tld4B2DFloatFloat,
158   Tld4A2DFloatFloat,
159   Tld4R2DS64Float,
160   Tld4G2DS64Float,
161   Tld4B2DS64Float,
162   Tld4A2DS64Float,
163   Tld4R2DU64Float,
164   Tld4G2DU64Float,
165   Tld4B2DU64Float,
166   Tld4A2DU64Float,
167   TexUnified1DFloatS32,
168   TexUnified1DFloatFloat,
169   TexUnified1DFloatFloatLevel,
170   TexUnified1DFloatFloatGrad,
171   TexUnified1DS32S32,
172   TexUnified1DS32Float,
173   TexUnified1DS32FloatLevel,
174   TexUnified1DS32FloatGrad,
175   TexUnified1DU32S32,
176   TexUnified1DU32Float,
177   TexUnified1DU32FloatLevel,
178   TexUnified1DU32FloatGrad,
179   TexUnified1DArrayFloatS32,
180   TexUnified1DArrayFloatFloat,
181   TexUnified1DArrayFloatFloatLevel,
182   TexUnified1DArrayFloatFloatGrad,
183   TexUnified1DArrayS32S32,
184   TexUnified1DArrayS32Float,
185   TexUnified1DArrayS32FloatLevel,
186   TexUnified1DArrayS32FloatGrad,
187   TexUnified1DArrayU32S32,
188   TexUnified1DArrayU32Float,
189   TexUnified1DArrayU32FloatLevel,
190   TexUnified1DArrayU32FloatGrad,
191   TexUnified2DFloatS32,
192   TexUnified2DFloatFloat,
193   TexUnified2DFloatFloatLevel,
194   TexUnified2DFloatFloatGrad,
195   TexUnified2DS32S32,
196   TexUnified2DS32Float,
197   TexUnified2DS32FloatLevel,
198   TexUnified2DS32FloatGrad,
199   TexUnified2DU32S32,
200   TexUnified2DU32Float,
201   TexUnified2DU32FloatLevel,
202   TexUnified2DU32FloatGrad,
203   TexUnified2DArrayFloatS32,
204   TexUnified2DArrayFloatFloat,
205   TexUnified2DArrayFloatFloatLevel,
206   TexUnified2DArrayFloatFloatGrad,
207   TexUnified2DArrayS32S32,
208   TexUnified2DArrayS32Float,
209   TexUnified2DArrayS32FloatLevel,
210   TexUnified2DArrayS32FloatGrad,
211   TexUnified2DArrayU32S32,
212   TexUnified2DArrayU32Float,
213   TexUnified2DArrayU32FloatLevel,
214   TexUnified2DArrayU32FloatGrad,
215   TexUnified3DFloatS32,
216   TexUnified3DFloatFloat,
217   TexUnified3DFloatFloatLevel,
218   TexUnified3DFloatFloatGrad,
219   TexUnified3DS32S32,
220   TexUnified3DS32Float,
221   TexUnified3DS32FloatLevel,
222   TexUnified3DS32FloatGrad,
223   TexUnified3DU32S32,
224   TexUnified3DU32Float,
225   TexUnified3DU32FloatLevel,
226   TexUnified3DU32FloatGrad,
227   TexUnifiedCubeFloatFloat,
228   TexUnifiedCubeFloatFloatLevel,
229   TexUnifiedCubeS32Float,
230   TexUnifiedCubeS32FloatLevel,
231   TexUnifiedCubeU32Float,
232   TexUnifiedCubeU32FloatLevel,
233   TexUnifiedCubeArrayFloatFloat,
234   TexUnifiedCubeArrayFloatFloatLevel,
235   TexUnifiedCubeArrayS32Float,
236   TexUnifiedCubeArrayS32FloatLevel,
237   TexUnifiedCubeArrayU32Float,
238   TexUnifiedCubeArrayU32FloatLevel,
239   Tld4UnifiedR2DFloatFloat,
240   Tld4UnifiedG2DFloatFloat,
241   Tld4UnifiedB2DFloatFloat,
242   Tld4UnifiedA2DFloatFloat,
243   Tld4UnifiedR2DS64Float,
244   Tld4UnifiedG2DS64Float,
245   Tld4UnifiedB2DS64Float,
246   Tld4UnifiedA2DS64Float,
247   Tld4UnifiedR2DU64Float,
248   Tld4UnifiedG2DU64Float,
249   Tld4UnifiedB2DU64Float,
250   Tld4UnifiedA2DU64Float,
251 
252   // Surface intrinsics
253   Suld1DI8Clamp,
254   Suld1DI16Clamp,
255   Suld1DI32Clamp,
256   Suld1DI64Clamp,
257   Suld1DV2I8Clamp,
258   Suld1DV2I16Clamp,
259   Suld1DV2I32Clamp,
260   Suld1DV2I64Clamp,
261   Suld1DV4I8Clamp,
262   Suld1DV4I16Clamp,
263   Suld1DV4I32Clamp,
264 
265   Suld1DArrayI8Clamp,
266   Suld1DArrayI16Clamp,
267   Suld1DArrayI32Clamp,
268   Suld1DArrayI64Clamp,
269   Suld1DArrayV2I8Clamp,
270   Suld1DArrayV2I16Clamp,
271   Suld1DArrayV2I32Clamp,
272   Suld1DArrayV2I64Clamp,
273   Suld1DArrayV4I8Clamp,
274   Suld1DArrayV4I16Clamp,
275   Suld1DArrayV4I32Clamp,
276 
277   Suld2DI8Clamp,
278   Suld2DI16Clamp,
279   Suld2DI32Clamp,
280   Suld2DI64Clamp,
281   Suld2DV2I8Clamp,
282   Suld2DV2I16Clamp,
283   Suld2DV2I32Clamp,
284   Suld2DV2I64Clamp,
285   Suld2DV4I8Clamp,
286   Suld2DV4I16Clamp,
287   Suld2DV4I32Clamp,
288 
289   Suld2DArrayI8Clamp,
290   Suld2DArrayI16Clamp,
291   Suld2DArrayI32Clamp,
292   Suld2DArrayI64Clamp,
293   Suld2DArrayV2I8Clamp,
294   Suld2DArrayV2I16Clamp,
295   Suld2DArrayV2I32Clamp,
296   Suld2DArrayV2I64Clamp,
297   Suld2DArrayV4I8Clamp,
298   Suld2DArrayV4I16Clamp,
299   Suld2DArrayV4I32Clamp,
300 
301   Suld3DI8Clamp,
302   Suld3DI16Clamp,
303   Suld3DI32Clamp,
304   Suld3DI64Clamp,
305   Suld3DV2I8Clamp,
306   Suld3DV2I16Clamp,
307   Suld3DV2I32Clamp,
308   Suld3DV2I64Clamp,
309   Suld3DV4I8Clamp,
310   Suld3DV4I16Clamp,
311   Suld3DV4I32Clamp,
312 
313   Suld1DI8Trap,
314   Suld1DI16Trap,
315   Suld1DI32Trap,
316   Suld1DI64Trap,
317   Suld1DV2I8Trap,
318   Suld1DV2I16Trap,
319   Suld1DV2I32Trap,
320   Suld1DV2I64Trap,
321   Suld1DV4I8Trap,
322   Suld1DV4I16Trap,
323   Suld1DV4I32Trap,
324 
325   Suld1DArrayI8Trap,
326   Suld1DArrayI16Trap,
327   Suld1DArrayI32Trap,
328   Suld1DArrayI64Trap,
329   Suld1DArrayV2I8Trap,
330   Suld1DArrayV2I16Trap,
331   Suld1DArrayV2I32Trap,
332   Suld1DArrayV2I64Trap,
333   Suld1DArrayV4I8Trap,
334   Suld1DArrayV4I16Trap,
335   Suld1DArrayV4I32Trap,
336 
337   Suld2DI8Trap,
338   Suld2DI16Trap,
339   Suld2DI32Trap,
340   Suld2DI64Trap,
341   Suld2DV2I8Trap,
342   Suld2DV2I16Trap,
343   Suld2DV2I32Trap,
344   Suld2DV2I64Trap,
345   Suld2DV4I8Trap,
346   Suld2DV4I16Trap,
347   Suld2DV4I32Trap,
348 
349   Suld2DArrayI8Trap,
350   Suld2DArrayI16Trap,
351   Suld2DArrayI32Trap,
352   Suld2DArrayI64Trap,
353   Suld2DArrayV2I8Trap,
354   Suld2DArrayV2I16Trap,
355   Suld2DArrayV2I32Trap,
356   Suld2DArrayV2I64Trap,
357   Suld2DArrayV4I8Trap,
358   Suld2DArrayV4I16Trap,
359   Suld2DArrayV4I32Trap,
360 
361   Suld3DI8Trap,
362   Suld3DI16Trap,
363   Suld3DI32Trap,
364   Suld3DI64Trap,
365   Suld3DV2I8Trap,
366   Suld3DV2I16Trap,
367   Suld3DV2I32Trap,
368   Suld3DV2I64Trap,
369   Suld3DV4I8Trap,
370   Suld3DV4I16Trap,
371   Suld3DV4I32Trap,
372 
373   Suld1DI8Zero,
374   Suld1DI16Zero,
375   Suld1DI32Zero,
376   Suld1DI64Zero,
377   Suld1DV2I8Zero,
378   Suld1DV2I16Zero,
379   Suld1DV2I32Zero,
380   Suld1DV2I64Zero,
381   Suld1DV4I8Zero,
382   Suld1DV4I16Zero,
383   Suld1DV4I32Zero,
384 
385   Suld1DArrayI8Zero,
386   Suld1DArrayI16Zero,
387   Suld1DArrayI32Zero,
388   Suld1DArrayI64Zero,
389   Suld1DArrayV2I8Zero,
390   Suld1DArrayV2I16Zero,
391   Suld1DArrayV2I32Zero,
392   Suld1DArrayV2I64Zero,
393   Suld1DArrayV4I8Zero,
394   Suld1DArrayV4I16Zero,
395   Suld1DArrayV4I32Zero,
396 
397   Suld2DI8Zero,
398   Suld2DI16Zero,
399   Suld2DI32Zero,
400   Suld2DI64Zero,
401   Suld2DV2I8Zero,
402   Suld2DV2I16Zero,
403   Suld2DV2I32Zero,
404   Suld2DV2I64Zero,
405   Suld2DV4I8Zero,
406   Suld2DV4I16Zero,
407   Suld2DV4I32Zero,
408 
409   Suld2DArrayI8Zero,
410   Suld2DArrayI16Zero,
411   Suld2DArrayI32Zero,
412   Suld2DArrayI64Zero,
413   Suld2DArrayV2I8Zero,
414   Suld2DArrayV2I16Zero,
415   Suld2DArrayV2I32Zero,
416   Suld2DArrayV2I64Zero,
417   Suld2DArrayV4I8Zero,
418   Suld2DArrayV4I16Zero,
419   Suld2DArrayV4I32Zero,
420 
421   Suld3DI8Zero,
422   Suld3DI16Zero,
423   Suld3DI32Zero,
424   Suld3DI64Zero,
425   Suld3DV2I8Zero,
426   Suld3DV2I16Zero,
427   Suld3DV2I32Zero,
428   Suld3DV2I64Zero,
429   Suld3DV4I8Zero,
430   Suld3DV4I16Zero,
431   Suld3DV4I32Zero
432 };
433 }
434 
435 class NVPTXSubtarget;
436 
437 //===--------------------------------------------------------------------===//
438 // TargetLowering Implementation
439 //===--------------------------------------------------------------------===//
440 class NVPTXTargetLowering : public TargetLowering {
441 public:
442   explicit NVPTXTargetLowering(const NVPTXTargetMachine &TM,
443                                const NVPTXSubtarget &STI);
444   SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
445 
446   SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
447 
448   const char *getTargetNodeName(unsigned Opcode) const override;
449 
450   bool getTgtMemIntrinsic(IntrinsicInfo &Info, const CallInst &I,
451                           MachineFunction &MF,
452                           unsigned Intrinsic) const override;
453 
454   /// getFunctionParamOptimizedAlign - since function arguments are passed via
455   /// .param space, we may want to increase their alignment in a way that
456   /// ensures that we can effectively vectorize their loads & stores. We can
457   /// increase alignment only if the function has internal or has private
458   /// linkage as for other linkage types callers may already rely on default
459   /// alignment. To allow using 128-bit vectorized loads/stores, this function
460   /// ensures that alignment is 16 or greater.
461   Align getFunctionParamOptimizedAlign(const Function *F, Type *ArgTy,
462                                        const DataLayout &DL) const;
463 
464   /// Helper for computing alignment of a device function byval parameter.
465   Align getFunctionByValParamAlign(const Function *F, Type *ArgTy,
466                                    Align InitialAlign,
467                                    const DataLayout &DL) const;
468 
469   // Helper for getting a function parameter name. Name is composed from
470   // its index and the function name. Negative index corresponds to special
471   // parameter (unsized array) used for passing variable arguments.
472   std::string getParamName(const Function *F, int Idx) const;
473 
474   /// isLegalAddressingMode - Return true if the addressing mode represented
475   /// by AM is legal for this target, for a load/store of the specified type
476   /// Used to guide target specific optimizations, like loop strength
477   /// reduction (LoopStrengthReduce.cpp) and memory optimization for
478   /// address mode (CodeGenPrepare.cpp)
479   bool isLegalAddressingMode(const DataLayout &DL, const AddrMode &AM, Type *Ty,
480                              unsigned AS,
481                              Instruction *I = nullptr) const override;
482 
483   bool isTruncateFree(Type *SrcTy, Type *DstTy) const override {
484     // Truncating 64-bit to 32-bit is free in SASS.
485     if (!SrcTy->isIntegerTy() || !DstTy->isIntegerTy())
486       return false;
487     return SrcTy->getPrimitiveSizeInBits() == 64 &&
488            DstTy->getPrimitiveSizeInBits() == 32;
489   }
490 
491   EVT getSetCCResultType(const DataLayout &DL, LLVMContext &Ctx,
492                          EVT VT) const override {
493     if (VT.isVector())
494       return EVT::getVectorVT(Ctx, MVT::i1, VT.getVectorNumElements());
495     return MVT::i1;
496   }
497 
498   ConstraintType getConstraintType(StringRef Constraint) const override;
499   std::pair<unsigned, const TargetRegisterClass *>
500   getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
501                                StringRef Constraint, MVT VT) const override;
502 
503   SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
504                                bool isVarArg,
505                                const SmallVectorImpl<ISD::InputArg> &Ins,
506                                const SDLoc &dl, SelectionDAG &DAG,
507                                SmallVectorImpl<SDValue> &InVals) const override;
508 
509   SDValue LowerCall(CallLoweringInfo &CLI,
510                     SmallVectorImpl<SDValue> &InVals) const override;
511 
512   std::string
513   getPrototype(const DataLayout &DL, Type *, const ArgListTy &,
514                const SmallVectorImpl<ISD::OutputArg> &, MaybeAlign retAlignment,
515                std::optional<std::pair<unsigned, const APInt &>> VAInfo,
516                const CallBase &CB, unsigned UniqueCallSite) const;
517 
518   SDValue LowerReturn(SDValue Chain, CallingConv::ID CallConv, bool isVarArg,
519                       const SmallVectorImpl<ISD::OutputArg> &Outs,
520                       const SmallVectorImpl<SDValue> &OutVals, const SDLoc &dl,
521                       SelectionDAG &DAG) const override;
522 
523   void LowerAsmOperandForConstraint(SDValue Op, std::string &Constraint,
524                                     std::vector<SDValue> &Ops,
525                                     SelectionDAG &DAG) const override;
526 
527   const NVPTXTargetMachine *nvTM;
528 
529   // PTX always uses 32-bit shift amounts
530   MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override {
531     return MVT::i32;
532   }
533 
534   TargetLoweringBase::LegalizeTypeAction
535   getPreferredVectorAction(MVT VT) const override;
536 
537   // Get the degree of precision we want from 32-bit floating point division
538   // operations.
539   //
540   //  0 - Use ptx div.approx
541   //  1 - Use ptx.div.full (approximate, but less so than div.approx)
542   //  2 - Use IEEE-compliant div instructions, if available.
543   int getDivF32Level() const;
544 
545   // Get whether we should use a precise or approximate 32-bit floating point
546   // sqrt instruction.
547   bool usePrecSqrtF32() const;
548 
549   // Get whether we should use instructions that flush floating-point denormals
550   // to sign-preserving zero.
551   bool useF32FTZ(const MachineFunction &MF) const;
552 
553   SDValue getSqrtEstimate(SDValue Operand, SelectionDAG &DAG, int Enabled,
554                           int &ExtraSteps, bool &UseOneConst,
555                           bool Reciprocal) const override;
556 
557   unsigned combineRepeatedFPDivisors() const override { return 2; }
558 
559   bool allowFMA(MachineFunction &MF, CodeGenOpt::Level OptLevel) const;
560   bool allowUnsafeFPMath(MachineFunction &MF) const;
561 
562   bool isFMAFasterThanFMulAndFAdd(const MachineFunction &MF,
563                                   EVT) const override {
564     return true;
565   }
566 
567   bool enableAggressiveFMAFusion(EVT VT) const override { return true; }
568 
569   // The default is to transform llvm.ctlz(x, false) (where false indicates that
570   // x == 0 is not undefined behavior) into a branch that checks whether x is 0
571   // and avoids calling ctlz in that case.  We have a dedicated ctlz
572   // instruction, so we say that ctlz is cheap to speculate.
573   bool isCheapToSpeculateCtlz(Type *Ty) const override { return true; }
574 
575   AtomicExpansionKind shouldCastAtomicLoadInIR(LoadInst *LI) const override {
576     return AtomicExpansionKind::None;
577   }
578 
579   AtomicExpansionKind shouldCastAtomicStoreInIR(StoreInst *SI) const override {
580     return AtomicExpansionKind::None;
581   }
582 
583   AtomicExpansionKind
584   shouldExpandAtomicRMWInIR(AtomicRMWInst *AI) const override;
585 
586 private:
587   const NVPTXSubtarget &STI; // cache the subtarget here
588   SDValue getParamSymbol(SelectionDAG &DAG, int idx, EVT) const;
589 
590   SDValue LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG) const;
591   SDValue LowerCONCAT_VECTORS(SDValue Op, SelectionDAG &DAG) const;
592   SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) const;
593 
594   SDValue LowerFROUND(SDValue Op, SelectionDAG &DAG) const;
595   SDValue LowerFROUND32(SDValue Op, SelectionDAG &DAG) const;
596   SDValue LowerFROUND64(SDValue Op, SelectionDAG &DAG) const;
597 
598   SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
599   SDValue LowerLOADi1(SDValue Op, SelectionDAG &DAG) const;
600 
601   SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
602   SDValue LowerSTOREi1(SDValue Op, SelectionDAG &DAG) const;
603   SDValue LowerSTOREVector(SDValue Op, SelectionDAG &DAG) const;
604 
605   SDValue LowerShiftRightParts(SDValue Op, SelectionDAG &DAG) const;
606   SDValue LowerShiftLeftParts(SDValue Op, SelectionDAG &DAG) const;
607 
608   SDValue LowerSelect(SDValue Op, SelectionDAG &DAG) const;
609 
610   SDValue LowerVAARG(SDValue Op, SelectionDAG &DAG) const;
611   SDValue LowerVASTART(SDValue Op, SelectionDAG &DAG) const;
612 
613   void ReplaceNodeResults(SDNode *N, SmallVectorImpl<SDValue> &Results,
614                           SelectionDAG &DAG) const override;
615   SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
616 
617   Align getArgumentAlignment(SDValue Callee, const CallBase *CB, Type *Ty,
618                              unsigned Idx, const DataLayout &DL) const;
619 };
620 } // namespace llvm
621 
622 #endif
623