LLVM 22.0.0git
AArch64SelectionDAGInfo.cpp
Go to the documentation of this file.
1//===-- AArch64SelectionDAGInfo.cpp - AArch64 SelectionDAG Info -----------===//
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 implements the AArch64SelectionDAGInfo class.
10//
11//===----------------------------------------------------------------------===//
12
15
16#define GET_SDNODE_DESC
17#include "AArch64GenSDNodeInfo.inc"
18#undef GET_SDNODE_DESC
19
20using namespace llvm;
21
22#define DEBUG_TYPE "aarch64-selectiondag-info"
23
24static cl::opt<bool>
25 LowerToSMERoutines("aarch64-lower-to-sme-routines", cl::Hidden,
26 cl::desc("Enable AArch64 SME memory operations "
27 "to lower to librt functions"),
28 cl::init(true));
29
31 : SelectionDAGGenTargetInfo(AArch64GenSDNodeInfo) {}
32
34 const SDNode *N) const {
36
37#ifndef NDEBUG
38 // Some additional checks not yet implemented by verifyTargetNode.
39 constexpr MVT FlagsVT = MVT::i32;
40 switch (N->getOpcode()) {
41 case AArch64ISD::SUBS:
42 assert(N->getValueType(1) == FlagsVT);
43 break;
44 case AArch64ISD::ADC:
45 case AArch64ISD::SBC:
46 assert(N->getOperand(2).getValueType() == FlagsVT);
47 break;
48 case AArch64ISD::ADCS:
49 case AArch64ISD::SBCS:
50 assert(N->getValueType(1) == FlagsVT);
51 assert(N->getOperand(2).getValueType() == FlagsVT);
52 break;
53 case AArch64ISD::CSEL:
54 case AArch64ISD::CSINC:
55 case AArch64ISD::BRCOND:
56 assert(N->getOperand(3).getValueType() == FlagsVT);
57 break;
58 case AArch64ISD::SADDWT:
59 case AArch64ISD::SADDWB:
60 case AArch64ISD::UADDWT:
61 case AArch64ISD::UADDWB: {
62 assert(N->getNumValues() == 1 && "Expected one result!");
63 assert(N->getNumOperands() == 2 && "Expected two operands!");
64 EVT VT = N->getValueType(0);
65 EVT Op0VT = N->getOperand(0).getValueType();
66 EVT Op1VT = N->getOperand(1).getValueType();
67 assert(VT.isVector() && Op0VT.isVector() && Op1VT.isVector() &&
68 VT.isInteger() && Op0VT.isInteger() && Op1VT.isInteger() &&
69 "Expected integer vectors!");
70 assert(VT == Op0VT &&
71 "Expected result and first input to have the same type!");
72 assert(Op0VT.getSizeInBits() == Op1VT.getSizeInBits() &&
73 "Expected vectors of equal size!");
74 assert(Op0VT.getVectorElementCount() * 2 == Op1VT.getVectorElementCount() &&
75 "Expected result vector and first input vector to have half the "
76 "lanes of the second input vector!");
77 break;
78 }
79 case AArch64ISD::SUNPKLO:
80 case AArch64ISD::SUNPKHI:
81 case AArch64ISD::UUNPKLO:
82 case AArch64ISD::UUNPKHI: {
83 assert(N->getNumValues() == 1 && "Expected one result!");
84 assert(N->getNumOperands() == 1 && "Expected one operand!");
85 EVT VT = N->getValueType(0);
86 EVT OpVT = N->getOperand(0).getValueType();
87 assert(OpVT.isVector() && VT.isVector() && OpVT.isInteger() &&
88 VT.isInteger() && "Expected integer vectors!");
89 assert(OpVT.getSizeInBits() == VT.getSizeInBits() &&
90 "Expected vectors of equal size!");
92 "Expected result vector with half the lanes of its input!");
93 break;
94 }
95 case AArch64ISD::TRN1:
96 case AArch64ISD::TRN2:
97 case AArch64ISD::UZP1:
98 case AArch64ISD::UZP2:
99 case AArch64ISD::ZIP1:
100 case AArch64ISD::ZIP2: {
101 assert(N->getNumValues() == 1 && "Expected one result!");
102 assert(N->getNumOperands() == 2 && "Expected two operands!");
103 EVT VT = N->getValueType(0);
104 EVT Op0VT = N->getOperand(0).getValueType();
105 EVT Op1VT = N->getOperand(1).getValueType();
106 assert(VT.isVector() && Op0VT.isVector() && Op1VT.isVector() &&
107 "Expected vectors!");
108 assert(VT == Op0VT && VT == Op1VT && "Expected matching vectors!");
109 break;
110 }
111 case AArch64ISD::RSHRNB_I: {
112 assert(N->getNumValues() == 1 && "Expected one result!");
113 assert(N->getNumOperands() == 2 && "Expected two operands!");
114 EVT VT = N->getValueType(0);
115 EVT Op0VT = N->getOperand(0).getValueType();
116 EVT Op1VT = N->getOperand(1).getValueType();
117 assert(VT.isVector() && VT.isInteger() &&
118 "Expected integer vector result type!");
119 assert(Op0VT.isVector() && Op0VT.isInteger() &&
120 "Expected first operand to be an integer vector!");
121 assert(VT.getSizeInBits() == Op0VT.getSizeInBits() &&
122 "Expected vectors of equal size!");
124 "Expected input vector with half the lanes of its result!");
125 assert(Op1VT == MVT::i32 && isa<ConstantSDNode>(N->getOperand(1)) &&
126 "Expected second operand to be a constant i32!");
127 break;
128 }
129 }
130#endif
131}
132
134 const SDLoc &DL, SDValue Chain,
135 SDValue Dst, SDValue SrcOrValue,
136 SDValue Size, Align Alignment,
137 bool isVolatile,
138 MachinePointerInfo DstPtrInfo,
139 MachinePointerInfo SrcPtrInfo) const {
140
141 // Get the constant size of the copy/set.
142 uint64_t ConstSize = 0;
143 if (auto *C = dyn_cast<ConstantSDNode>(Size))
144 ConstSize = C->getZExtValue();
145
146 const bool IsSet = Opcode == AArch64::MOPSMemorySetPseudo ||
147 Opcode == AArch64::MOPSMemorySetTaggingPseudo;
148
150
151 auto Vol =
153 auto DstFlags = MachineMemOperand::MOStore | Vol;
154 auto *DstOp =
155 MF.getMachineMemOperand(DstPtrInfo, DstFlags, ConstSize, Alignment);
156
157 if (IsSet) {
158 // Extend value to i64, if required.
159 if (SrcOrValue.getValueType() != MVT::i64)
160 SrcOrValue = DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i64, SrcOrValue);
161 SDValue Ops[] = {Dst, Size, SrcOrValue, Chain};
162 const EVT ResultTys[] = {MVT::i64, MVT::i64, MVT::Other};
163 MachineSDNode *Node = DAG.getMachineNode(Opcode, DL, ResultTys, Ops);
164 DAG.setNodeMemRefs(Node, {DstOp});
165 return SDValue(Node, 2);
166 } else {
167 SDValue Ops[] = {Dst, SrcOrValue, Size, Chain};
168 const EVT ResultTys[] = {MVT::i64, MVT::i64, MVT::i64, MVT::Other};
169 MachineSDNode *Node = DAG.getMachineNode(Opcode, DL, ResultTys, Ops);
170
171 auto SrcFlags = MachineMemOperand::MOLoad | Vol;
172 auto *SrcOp =
173 MF.getMachineMemOperand(SrcPtrInfo, SrcFlags, ConstSize, Alignment);
174 DAG.setNodeMemRefs(Node, {DstOp, SrcOp});
175 return SDValue(Node, 3);
176 }
177}
178
180 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dst, SDValue Src,
181 SDValue Size, RTLIB::Libcall LC) const {
182 const AArch64Subtarget &STI =
184 const AArch64TargetLowering *TLI = STI.getTargetLowering();
186 Args.emplace_back(Dst, PointerType::getUnqual(*DAG.getContext()));
187
188 RTLIB::Libcall NewLC;
189 switch (LC) {
190 case RTLIB::MEMCPY: {
191 NewLC = RTLIB::SC_MEMCPY;
192 Args.emplace_back(Src, PointerType::getUnqual(*DAG.getContext()));
193 break;
194 }
195 case RTLIB::MEMMOVE: {
196 NewLC = RTLIB::SC_MEMMOVE;
197 Args.emplace_back(Src, PointerType::getUnqual(*DAG.getContext()));
198 break;
199 }
200 case RTLIB::MEMSET: {
201 NewLC = RTLIB::SC_MEMSET;
202 Args.emplace_back(DAG.getZExtOrTrunc(Src, DL, MVT::i32),
204 break;
205 }
206 default:
207 return SDValue();
208 }
209
210 EVT PointerVT = TLI->getPointerTy(DAG.getDataLayout());
211 SDValue Symbol = DAG.getExternalSymbol(TLI->getLibcallName(NewLC), PointerVT);
212 Args.emplace_back(Size, DAG.getDataLayout().getIntPtrType(*DAG.getContext()));
213
217 TLI->getLibcallCallingConv(NewLC), RetTy, Symbol, std::move(Args));
218 return TLI->LowerCallTo(CLI).second;
219}
220
222 SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dst, SDValue Src,
223 SDValue Size, Align Alignment, bool isVolatile, bool AlwaysInline,
224 MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const {
225 const AArch64Subtarget &STI =
227
228 if (STI.hasMOPS())
229 return EmitMOPS(AArch64::MOPSMemoryCopyPseudo, DAG, DL, Chain, Dst, Src,
230 Size, Alignment, isVolatile, DstPtrInfo, SrcPtrInfo);
231
233 SMEAttrs Attrs = AFI->getSMEFnAttrs();
234 if (LowerToSMERoutines && !Attrs.hasNonStreamingInterfaceAndBody())
235 return EmitStreamingCompatibleMemLibCall(DAG, DL, Chain, Dst, Src, Size,
236 RTLIB::MEMCPY);
237 return SDValue();
238}
239
241 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
242 SDValue Size, Align Alignment, bool isVolatile, bool AlwaysInline,
243 MachinePointerInfo DstPtrInfo) const {
244 const AArch64Subtarget &STI =
246
247 if (STI.hasMOPS())
248 return EmitMOPS(AArch64::MOPSMemorySetPseudo, DAG, dl, Chain, Dst, Src,
249 Size, Alignment, isVolatile, DstPtrInfo,
251
253 SMEAttrs Attrs = AFI->getSMEFnAttrs();
254 if (LowerToSMERoutines && !Attrs.hasNonStreamingInterfaceAndBody())
255 return EmitStreamingCompatibleMemLibCall(DAG, dl, Chain, Dst, Src, Size,
256 RTLIB::MEMSET);
257 return SDValue();
258}
259
261 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src,
262 SDValue Size, Align Alignment, bool isVolatile,
263 MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const {
264 const AArch64Subtarget &STI =
266
267 if (STI.hasMOPS())
268 return EmitMOPS(AArch64::MOPSMemoryMovePseudo, DAG, dl, Chain, Dst, Src,
269 Size, Alignment, isVolatile, DstPtrInfo, SrcPtrInfo);
270
272 SMEAttrs Attrs = AFI->getSMEFnAttrs();
273 if (LowerToSMERoutines && !Attrs.hasNonStreamingInterfaceAndBody())
274 return EmitStreamingCompatibleMemLibCall(DAG, dl, Chain, Dst, Src, Size,
275 RTLIB::MEMMOVE);
276 return SDValue();
277}
278
279static const int kSetTagLoopThreshold = 176;
280
282 SDValue Chain, SDValue Ptr, uint64_t ObjSize,
283 const MachineMemOperand *BaseMemOperand,
284 bool ZeroData) {
286 unsigned ObjSizeScaled = ObjSize / 16;
287
288 SDValue TagSrc = Ptr;
289 if (Ptr.getOpcode() == ISD::FrameIndex) {
290 int FI = cast<FrameIndexSDNode>(Ptr)->getIndex();
291 Ptr = DAG.getTargetFrameIndex(FI, MVT::i64);
292 // A frame index operand may end up as [SP + offset] => it is fine to use SP
293 // register as the tag source.
294 TagSrc = DAG.getRegister(AArch64::SP, MVT::i64);
295 }
296
297 const unsigned OpCode1 = ZeroData ? AArch64ISD::STZG : AArch64ISD::STG;
298 const unsigned OpCode2 = ZeroData ? AArch64ISD::STZ2G : AArch64ISD::ST2G;
299
300 SmallVector<SDValue, 8> OutChains;
301 unsigned OffsetScaled = 0;
302 while (OffsetScaled < ObjSizeScaled) {
303 if (ObjSizeScaled - OffsetScaled >= 2) {
304 SDValue AddrNode = DAG.getMemBasePlusOffset(
305 Ptr, TypeSize::getFixed(OffsetScaled * 16), dl);
307 OpCode2, dl, DAG.getVTList(MVT::Other),
308 {Chain, TagSrc, AddrNode},
309 MVT::v4i64,
310 MF.getMachineMemOperand(BaseMemOperand, OffsetScaled * 16, 16 * 2));
311 OffsetScaled += 2;
312 OutChains.push_back(St);
313 continue;
314 }
315
316 if (ObjSizeScaled - OffsetScaled > 0) {
317 SDValue AddrNode = DAG.getMemBasePlusOffset(
318 Ptr, TypeSize::getFixed(OffsetScaled * 16), dl);
320 OpCode1, dl, DAG.getVTList(MVT::Other),
321 {Chain, TagSrc, AddrNode},
322 MVT::v2i64,
323 MF.getMachineMemOperand(BaseMemOperand, OffsetScaled * 16, 16));
324 OffsetScaled += 1;
325 OutChains.push_back(St);
326 }
327 }
328
329 SDValue Res = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
330 return Res;
331}
332
334 SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Addr,
335 SDValue Size, MachinePointerInfo DstPtrInfo, bool ZeroData) const {
336 uint64_t ObjSize = Size->getAsZExtVal();
337 assert(ObjSize % 16 == 0);
338
340 MachineMemOperand *BaseMemOperand = MF.getMachineMemOperand(
341 DstPtrInfo, MachineMemOperand::MOStore, ObjSize, Align(16));
342
343 bool UseSetTagRangeLoop =
344 kSetTagLoopThreshold >= 0 && (int)ObjSize >= kSetTagLoopThreshold;
345 if (!UseSetTagRangeLoop)
346 return EmitUnrolledSetTag(DAG, dl, Chain, Addr, ObjSize, BaseMemOperand,
347 ZeroData);
348
349 const EVT ResTys[] = {MVT::i64, MVT::i64, MVT::Other};
350
351 unsigned Opcode;
352 if (Addr.getOpcode() == ISD::FrameIndex) {
353 int FI = cast<FrameIndexSDNode>(Addr)->getIndex();
354 Addr = DAG.getTargetFrameIndex(FI, MVT::i64);
355 Opcode = ZeroData ? AArch64::STZGloop : AArch64::STGloop;
356 } else {
357 Opcode = ZeroData ? AArch64::STZGloop_wback : AArch64::STGloop_wback;
358 }
359 SDValue Ops[] = {DAG.getTargetConstant(ObjSize, dl, MVT::i64), Addr, Chain};
360 SDNode *St = DAG.getMachineNode(Opcode, dl, ResTys, Ops);
361
362 DAG.setNodeMemRefs(cast<MachineSDNode>(St), {BaseMemOperand});
363 return SDValue(St, 2);
364}
constexpr MVT FlagsVT
Value type used for NZCV flags.
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static SDValue EmitUnrolledSetTag(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Ptr, uint64_t ObjSize, const MachineMemOperand *BaseMemOperand, bool ZeroData)
static cl::opt< bool > LowerToSMERoutines("aarch64-lower-to-sme-routines", cl::Hidden, cl::desc("Enable AArch64 SME memory operations " "to lower to librt functions"), cl::init(true))
static const int kSetTagLoopThreshold
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
return RetTy
uint64_t Addr
uint64_t Size
AArch64FunctionInfo - This class is derived from MachineFunctionInfo and contains private AArch64-spe...
SDValue EmitMOPS(unsigned Opcode, SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dst, SDValue SrcOrValue, SDValue Size, Align Alignment, bool isVolatile, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const
SDValue EmitTargetCodeForMemmove(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVolatile, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const override
Emit target-specific code that performs a memmove.
SDValue EmitStreamingCompatibleMemLibCall(SelectionDAG &DAG, const SDLoc &DL, SDValue Chain, SDValue Dst, SDValue Src, SDValue Size, RTLIB::Libcall LC) const
SDValue EmitTargetCodeForMemcpy(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVolatile, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const override
Emit target-specific code that performs a memcpy.
void verifyTargetNode(const SelectionDAG &DAG, const SDNode *N) const override
Checks that the given target-specific node is valid. Aborts if it is not.
SDValue EmitTargetCodeForMemset(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Dst, SDValue Src, SDValue Size, Align Alignment, bool isVolatile, bool AlwaysInline, MachinePointerInfo DstPtrInfo) const override
Emit target-specific code that performs a memset.
SDValue EmitTargetCodeForSetTag(SelectionDAG &DAG, const SDLoc &dl, SDValue Chain, SDValue Op1, SDValue Op2, MachinePointerInfo DstPtrInfo, bool ZeroData) const override
const AArch64TargetLowering * getTargetLowering() const override
LLVM_ABI IntegerType * getIntPtrType(LLVMContext &C, unsigned AddressSpace=0) const
Returns an integer type with size at least as big as that of a pointer in the given address space.
Definition: DataLayout.cpp:850
Machine Value Type.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, Align base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
A description of a memory reference used in the backend.
@ MOVolatile
The memory access is volatile.
@ MOLoad
The memory access reads data.
@ MOStore
The memory access writes data.
An SDNode that represents everything that will be needed to construct a MachineInstr.
Class to represent pointers.
Definition: DerivedTypes.h:700
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
Definition: DerivedTypes.h:720
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.
EVT getValueType() const
Return the ValueType of the referenced return value.
SMEAttrs is a utility class to parse the SME ACLE attributes on functions.
Proxy class that targets should inherit from if they wish to use the generated node descriptions.
void verifyTargetNode(const SelectionDAG &DAG, const SDNode *N) const override
Checks that the given target-specific node is valid. Aborts if it is not.
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
Definition: SelectionDAG.h:229
LLVM_ABI SDVTList getVTList(EVT VT)
Return an SDVTList that represents the list of values specified.
LLVM_ABI MachineSDNode * getMachineNode(unsigned Opcode, const SDLoc &dl, EVT VT)
These are used for target selectors to create a new node with specified return type(s),...
LLVM_ABI SDValue getRegister(Register Reg, EVT VT)
LLVM_ABI SDValue getMemIntrinsicNode(unsigned Opcode, const SDLoc &dl, SDVTList VTList, ArrayRef< SDValue > Ops, EVT MemVT, MachinePointerInfo PtrInfo, Align Alignment, MachineMemOperand::Flags Flags=MachineMemOperand::MOLoad|MachineMemOperand::MOStore, LocationSize Size=LocationSize::precise(0), const AAMDNodes &AAInfo=AAMDNodes())
Creates a MemIntrinsicNode that may produce a result and takes a list of operands.
LLVM_ABI void setNodeMemRefs(MachineSDNode *N, ArrayRef< MachineMemOperand * > NewMemRefs)
Mutate the specified machine node's memory references to the provided list.
const DataLayout & getDataLayout() const
Definition: SelectionDAG.h:498
SDValue getTargetFrameIndex(int FI, EVT VT)
Definition: SelectionDAG.h:763
LLVM_ABI SDValue getMemBasePlusOffset(SDValue Base, TypeSize Offset, const SDLoc &DL, const SDNodeFlags Flags=SDNodeFlags())
Returns sum of the base pointer and offset.
LLVM_ABI SDValue getExternalSymbol(const char *Sym, EVT VT)
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
SDValue getTargetConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isOpaque=false)
Definition: SelectionDAG.h:707
MachineFunction & getMachineFunction() const
Definition: SelectionDAG.h:493
LLVM_ABI SDValue getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either zero-extending or trunca...
LLVMContext * getContext() const
Definition: SelectionDAG.h:511
void push_back(const T &Elt)
Definition: SmallVector.h:414
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1197
std::vector< ArgListEntry > ArgListTy
static constexpr TypeSize getFixed(ScalarTy ExactSize)
Definition: TypeSize.h:346
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
Definition: ISDOpcodes.h:835
@ FrameIndex
Definition: ISDOpcodes.h:90
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
Definition: ISDOpcodes.h:53
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:444
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
#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
ElementCount getVectorElementCount() const
Definition: ValueTypes.h:345
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition: ValueTypes.h:368
bool isVector() const
Return true if this is a vector value type.
Definition: ValueTypes.h:168
bool isInteger() const
Return true if this is an integer or a vector integer type.
Definition: ValueTypes.h:152
This class contains a discriminated union of information about pointers in memory operands,...
This structure contains all information that is necessary for lowering calls.
CallLoweringInfo & setLibCallee(CallingConv::ID CC, Type *ResultType, SDValue Target, ArgListTy &&ArgsList)
CallLoweringInfo & setDebugLoc(const SDLoc &dl)
CallLoweringInfo & setChain(SDValue InChain)