LLVM 22.0.0git
LoongArchISelDAGToDAG.cpp
Go to the documentation of this file.
1//=- LoongArchISelDAGToDAG.cpp - A dag to dag inst selector for LoongArch -===//
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 an instruction selector for the LoongArch target.
10//
11//===----------------------------------------------------------------------===//
12
19
20using namespace llvm;
21
22#define DEBUG_TYPE "loongarch-isel"
23#define PASS_NAME "LoongArch DAG->DAG Pattern Instruction Selection"
24
26
31
33 false)
34
36 // If we have a custom node, we have already selected.
37 if (Node->isMachineOpcode()) {
38 LLVM_DEBUG(dbgs() << "== "; Node->dump(CurDAG); dbgs() << "\n");
39 Node->setNodeId(-1);
40 return;
41 }
42
43 // Instruction Selection not handled by the auto-generated tablegen selection
44 // should be handled here.
45 unsigned Opcode = Node->getOpcode();
46 MVT GRLenVT = Subtarget->getGRLenVT();
47 SDLoc DL(Node);
48 MVT VT = Node->getSimpleValueType(0);
49
50 switch (Opcode) {
51 default:
52 break;
53 case ISD::Constant: {
54 int64_t Imm = cast<ConstantSDNode>(Node)->getSExtValue();
55 if (Imm == 0 && VT == GRLenVT) {
56 SDValue New = CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL,
57 LoongArch::R0, GRLenVT);
58 ReplaceNode(Node, New.getNode());
59 return;
60 }
61 SDNode *Result = nullptr;
62 SDValue SrcReg = CurDAG->getRegister(LoongArch::R0, GRLenVT);
63 // The instructions in the sequence are handled here.
65 SDValue SDImm = CurDAG->getSignedTargetConstant(Inst.Imm, DL, GRLenVT);
66 switch (Inst.Opc) {
67 case LoongArch::LU12I_W:
68 Result = CurDAG->getMachineNode(Inst.Opc, DL, GRLenVT, SDImm);
69 break;
70 case LoongArch::ADDI_W:
71 case LoongArch::ORI:
72 case LoongArch::LU32I_D:
73 case LoongArch::LU52I_D:
74 Result = CurDAG->getMachineNode(Inst.Opc, DL, GRLenVT, SrcReg, SDImm);
75 break;
76 case LoongArch::BSTRINS_D:
77 Result = CurDAG->getMachineNode(
78 Inst.Opc, DL, GRLenVT,
79 {SrcReg, SrcReg,
80 CurDAG->getSignedTargetConstant(Inst.Imm >> 32, DL, GRLenVT),
81 CurDAG->getTargetConstant(Inst.Imm & 0xFF, DL, GRLenVT)});
82 break;
83 default:
84 llvm_unreachable("unexpected opcode generated by LoongArchMatInt");
85 }
86 SrcReg = SDValue(Result, 0);
87 }
88
89 ReplaceNode(Node, Result);
90 return;
91 }
92 case ISD::FrameIndex: {
93 SDValue Imm = CurDAG->getTargetConstant(0, DL, GRLenVT);
94 int FI = cast<FrameIndexSDNode>(Node)->getIndex();
95 SDValue TFI = CurDAG->getTargetFrameIndex(FI, VT);
96 unsigned ADDIOp =
97 Subtarget->is64Bit() ? LoongArch::ADDI_D : LoongArch::ADDI_W;
98 ReplaceNode(Node, CurDAG->getMachineNode(ADDIOp, DL, VT, TFI, Imm));
99 return;
100 }
101 case ISD::BITCAST: {
102 if (VT.is128BitVector() || VT.is256BitVector()) {
103 ReplaceUses(SDValue(Node, 0), Node->getOperand(0));
104 CurDAG->RemoveDeadNode(Node);
105 return;
106 }
107 break;
108 }
109 case ISD::BUILD_VECTOR: {
110 // Select appropriate [x]vrepli.[bhwd] instructions for constant splats of
111 // 128/256-bit when LSX/LASX is enabled.
113 APInt SplatValue, SplatUndef;
114 unsigned SplatBitSize;
115 bool HasAnyUndefs;
116 unsigned Op = 0;
117 EVT ResTy = BVN->getValueType(0);
118 bool Is128Vec = BVN->getValueType(0).is128BitVector();
119 bool Is256Vec = BVN->getValueType(0).is256BitVector();
120 SDNode *Res;
121
122 if (!Subtarget->hasExtLSX() || (!Is128Vec && !Is256Vec))
123 break;
124 if (!BVN->isConstantSplat(SplatValue, SplatUndef, SplatBitSize,
125 HasAnyUndefs, 8))
126 break;
127
128 // If we have a signed 10 bit integer, we can splat it directly.
129 if (SplatValue.isSignedIntN(10)) {
130 switch (SplatBitSize) {
131 default:
132 break;
133 case 8:
134 Op = Is256Vec ? LoongArch::PseudoXVREPLI_B : LoongArch::PseudoVREPLI_B;
135 break;
136 case 16:
137 Op = Is256Vec ? LoongArch::PseudoXVREPLI_H : LoongArch::PseudoVREPLI_H;
138 break;
139 case 32:
140 Op = Is256Vec ? LoongArch::PseudoXVREPLI_W : LoongArch::PseudoVREPLI_W;
141 break;
142 case 64:
143 Op = Is256Vec ? LoongArch::PseudoXVREPLI_D : LoongArch::PseudoVREPLI_D;
144 break;
145 }
146
147 EVT EleType = ResTy.getVectorElementType();
148 APInt Val = SplatValue.sextOrTrunc(EleType.getSizeInBits());
149 SDValue Imm = CurDAG->getTargetConstant(Val, DL, EleType);
150 Res = CurDAG->getMachineNode(Op, DL, ResTy, Imm);
151 ReplaceNode(Node, Res);
152 return;
153 }
154
155 // Select appropriate [x]vldi instructions for some special constant splats,
156 // where the immediate value `imm[12] == 1` for used [x]vldi instructions.
157 const auto &TLI =
158 *static_cast<const LoongArchTargetLowering *>(getTargetLowering());
159 std::pair<bool, uint64_t> ConvertVLDI =
160 TLI.isImmVLDILegalForMode1(SplatValue, SplatBitSize);
161 if (ConvertVLDI.first) {
162 Op = Is256Vec ? LoongArch::XVLDI : LoongArch::VLDI;
163 SDValue Imm = CurDAG->getSignedTargetConstant(
164 SignExtend32<13>(ConvertVLDI.second), DL, MVT::i32);
165 Res = CurDAG->getMachineNode(Op, DL, ResTy, Imm);
166 ReplaceNode(Node, Res);
167 return;
168 }
169 break;
170 }
171 }
172
173 // Select the default instruction.
174 SelectCode(Node);
175}
176
178 const SDValue &Op, InlineAsm::ConstraintCode ConstraintID,
179 std::vector<SDValue> &OutOps) {
180 SDValue Base = Op;
182 CurDAG->getTargetConstant(0, SDLoc(Op), Subtarget->getGRLenVT());
183 switch (ConstraintID) {
184 default:
185 llvm_unreachable("unexpected asm memory constraint");
186 // Reg+Reg addressing.
188 Base = Op.getOperand(0);
189 Offset = Op.getOperand(1);
190 break;
191 // Reg+simm12 addressing.
193 if (CurDAG->isBaseWithConstantOffset(Op)) {
194 ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Op.getOperand(1));
195 if (isIntN(12, CN->getSExtValue())) {
196 Base = Op.getOperand(0);
197 Offset = CurDAG->getTargetConstant(CN->getZExtValue(), SDLoc(Op),
198 Op.getValueType());
199 }
200 }
201 break;
202 // Reg+0 addressing.
204 break;
205 // Reg+(simm14<<2) addressing.
207 if (CurDAG->isBaseWithConstantOffset(Op)) {
208 ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Op.getOperand(1));
209 if (isIntN(16, CN->getSExtValue()) &&
210 isAligned(Align(4ULL), CN->getZExtValue())) {
211 Base = Op.getOperand(0);
212 Offset = CurDAG->getTargetConstant(CN->getZExtValue(), SDLoc(Op),
213 Op.getValueType());
214 }
215 }
216 break;
217 }
218 OutOps.push_back(Base);
219 OutOps.push_back(Offset);
220 return false;
221}
222
224 // If this is FrameIndex, select it directly. Otherwise just let it get
225 // selected to a register independently.
226 if (auto *FIN = dyn_cast<FrameIndexSDNode>(Addr))
227 Base =
228 CurDAG->getTargetFrameIndex(FIN->getIndex(), Subtarget->getGRLenVT());
229 else
230 Base = Addr;
231 return true;
232}
233
234// Fold constant addresses.
236 SDValue &Offset) {
237 SDLoc DL(Addr);
238 MVT VT = Addr.getSimpleValueType();
239
240 if (!isa<ConstantSDNode>(Addr))
241 return false;
242
243 // If the constant is a simm12, we can fold the whole constant and use R0 as
244 // the base.
245 int64_t CVal = cast<ConstantSDNode>(Addr)->getSExtValue();
246 if (!isInt<12>(CVal))
247 return false;
248 Base = CurDAG->getRegister(LoongArch::R0, VT);
249 Offset = CurDAG->getSignedTargetConstant(SignExtend64<12>(CVal), DL, VT);
250 return true;
251}
252
254 // If this is FrameIndex, don't select it.
255 if (isa<FrameIndexSDNode>(Addr))
256 return false;
257 Base = Addr;
258 return true;
259}
260
262 SDValue &Offset) {
263 SDLoc DL(Addr);
264 MVT VT = Addr.getSimpleValueType();
265
266 // The address is the result of an ADD. Here we only consider reg+simm12.
267 if (CurDAG->isBaseWithConstantOffset(Addr)) {
268 int64_t Imm = cast<ConstantSDNode>(Addr.getOperand(1))->getSExtValue();
269 if (isInt<12>(Imm)) {
270 Base = Addr.getOperand(0);
271 Offset = CurDAG->getSignedTargetConstant(SignExtend64<12>(Imm), DL, VT);
272 return true;
273 }
274 }
275
276 // Otherwise, we assume Addr as the base address and use constant 0 as the
277 // offset.
278 Base = Addr;
279 Offset = CurDAG->getTargetConstant(0, DL, VT);
280 return true;
281}
282
284 SDValue &ShAmt) {
285 // Shift instructions on LoongArch only read the lower 5 or 6 bits of the
286 // shift amount. If there is an AND on the shift amount, we can bypass it if
287 // it doesn't affect any of those bits.
288 if (N.getOpcode() == ISD::AND && isa<ConstantSDNode>(N.getOperand(1))) {
289 const APInt &AndMask = N->getConstantOperandAPInt(1);
290
291 // Since the max shift amount is a power of 2 we can subtract 1 to make a
292 // mask that covers the bits needed to represent all shift amounts.
293 assert(isPowerOf2_32(ShiftWidth) && "Unexpected max shift amount!");
294 APInt ShMask(AndMask.getBitWidth(), ShiftWidth - 1);
295
296 if (ShMask.isSubsetOf(AndMask)) {
297 ShAmt = N.getOperand(0);
298 return true;
299 }
300
301 // SimplifyDemandedBits may have optimized the mask so try restoring any
302 // bits that are known zero.
303 KnownBits Known = CurDAG->computeKnownBits(N->getOperand(0));
304 if (ShMask.isSubsetOf(AndMask | Known.Zero)) {
305 ShAmt = N.getOperand(0);
306 return true;
307 }
308 } else if (N.getOpcode() == LoongArchISD::BSTRPICK) {
309 // Similar to the above AND, if there is a BSTRPICK on the shift amount, we
310 // can bypass it.
311 assert(isPowerOf2_32(ShiftWidth) && "Unexpected max shift amount!");
312 assert(isa<ConstantSDNode>(N.getOperand(1)) && "Illegal msb operand!");
313 assert(isa<ConstantSDNode>(N.getOperand(2)) && "Illegal lsb operand!");
314 uint64_t msb = N.getConstantOperandVal(1), lsb = N.getConstantOperandVal(2);
315 if (lsb == 0 && Log2_32(ShiftWidth) <= msb + 1) {
316 ShAmt = N.getOperand(0);
317 return true;
318 }
319 } else if (N.getOpcode() == ISD::SUB &&
320 isa<ConstantSDNode>(N.getOperand(0))) {
321 uint64_t Imm = N.getConstantOperandVal(0);
322 // If we are shifting by N-X where N == 0 mod Size, then just shift by -X to
323 // generate a NEG instead of a SUB of a constant.
324 if (Imm != 0 && Imm % ShiftWidth == 0) {
325 SDLoc DL(N);
326 EVT VT = N.getValueType();
327 SDValue Zero =
328 CurDAG->getCopyFromReg(CurDAG->getEntryNode(), DL, LoongArch::R0, VT);
329 unsigned NegOpc = VT == MVT::i64 ? LoongArch::SUB_D : LoongArch::SUB_W;
330 MachineSDNode *Neg =
331 CurDAG->getMachineNode(NegOpc, DL, VT, Zero, N.getOperand(1));
332 ShAmt = SDValue(Neg, 0);
333 return true;
334 }
335 }
336
337 ShAmt = N;
338 return true;
339}
340
342 if (N.getOpcode() == ISD::SIGN_EXTEND_INREG &&
343 cast<VTSDNode>(N.getOperand(1))->getVT() == MVT::i32) {
344 Val = N.getOperand(0);
345 return true;
346 }
347 if (N.getOpcode() == LoongArchISD::BSTRPICK &&
348 N.getConstantOperandVal(1) < UINT64_C(0X1F) &&
349 N.getConstantOperandVal(2) == UINT64_C(0)) {
350 Val = N;
351 return true;
352 }
353 MVT VT = N.getSimpleValueType();
354 if (CurDAG->ComputeNumSignBits(N) > (VT.getSizeInBits() - 32)) {
355 Val = N;
356 return true;
357 }
358
359 return false;
360}
361
363 if (N.getOpcode() == ISD::AND) {
364 auto *C = dyn_cast<ConstantSDNode>(N.getOperand(1));
365 if (C && C->getZExtValue() == UINT64_C(0xFFFFFFFF)) {
366 Val = N.getOperand(0);
367 return true;
368 }
369 }
370 MVT VT = N.getSimpleValueType();
372 if (CurDAG->MaskedValueIsZero(N, Mask)) {
373 Val = N;
374 return true;
375 }
376
377 return false;
378}
379
381 unsigned MinSizeInBits) const {
382 if (!Subtarget->hasExtLSX())
383 return false;
384
386
387 if (!Node)
388 return false;
389
390 APInt SplatValue, SplatUndef;
391 unsigned SplatBitSize;
392 bool HasAnyUndefs;
393
394 if (!Node->isConstantSplat(SplatValue, SplatUndef, SplatBitSize, HasAnyUndefs,
395 MinSizeInBits, /*IsBigEndian=*/false))
396 return false;
397
398 Imm = SplatValue;
399
400 return true;
401}
402
403template <unsigned ImmBitSize, bool IsSigned>
405 APInt ImmValue;
406 EVT EltTy = N->getValueType(0).getVectorElementType();
407
408 if (N->getOpcode() == ISD::BITCAST)
409 N = N->getOperand(0);
410
411 if (selectVSplat(N.getNode(), ImmValue, EltTy.getSizeInBits()) &&
412 ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
413 if (IsSigned && ImmValue.isSignedIntN(ImmBitSize)) {
414 SplatVal = CurDAG->getSignedTargetConstant(
415 ImmValue.getSExtValue(), SDLoc(N), Subtarget->getGRLenVT());
416 return true;
417 }
418 if (!IsSigned && ImmValue.isIntN(ImmBitSize)) {
419 SplatVal = CurDAG->getTargetConstant(ImmValue.getZExtValue(), SDLoc(N),
420 Subtarget->getGRLenVT());
421 return true;
422 }
423 }
424
425 return false;
426}
427
429 SDValue &SplatImm) const {
430 APInt ImmValue;
431 EVT EltTy = N->getValueType(0).getVectorElementType();
432
433 if (N->getOpcode() == ISD::BITCAST)
434 N = N->getOperand(0);
435
436 if (selectVSplat(N.getNode(), ImmValue, EltTy.getSizeInBits()) &&
437 ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
438 int32_t Log2 = (~ImmValue).exactLogBase2();
439
440 if (Log2 != -1) {
441 SplatImm = CurDAG->getSignedTargetConstant(Log2, SDLoc(N), EltTy);
442 return true;
443 }
444 }
445
446 return false;
447}
448
450 SDValue &SplatImm) const {
451 APInt ImmValue;
452 EVT EltTy = N->getValueType(0).getVectorElementType();
453
454 if (N->getOpcode() == ISD::BITCAST)
455 N = N->getOperand(0);
456
457 if (selectVSplat(N.getNode(), ImmValue, EltTy.getSizeInBits()) &&
458 ImmValue.getBitWidth() == EltTy.getSizeInBits()) {
459 int32_t Log2 = ImmValue.exactLogBase2();
460
461 if (Log2 != -1) {
462 SplatImm = CurDAG->getSignedTargetConstant(Log2, SDLoc(N), EltTy);
463 return true;
464 }
465 }
466
467 return false;
468}
469
470// This pass converts a legalized DAG into a LoongArch-specific DAG, ready
471// for instruction scheduling.
return SDValue()
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Register Bank Select
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define DEBUG_TYPE
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Definition PassSupport.h:56
#define PASS_NAME
Class for arbitrary precision integers.
Definition APInt.h:78
uint64_t getZExtValue() const
Get zero extended value.
Definition APInt.h:1540
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition APInt.h:1488
int32_t exactLogBase2() const
Definition APInt.h:1783
bool isSignedIntN(unsigned N) const
Check if this APInt has an N-bits signed integer value.
Definition APInt.h:435
LLVM_ABI APInt sextOrTrunc(unsigned width) const
Sign extend or truncate to width.
Definition APInt.cpp:1041
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
Definition APInt.h:1257
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
Definition APInt.h:296
bool isIntN(unsigned N) const
Check if this APInt has an N-bits unsigned integer value.
Definition APInt.h:432
int64_t getSExtValue() const
Get sign extended value.
Definition APInt.h:1562
A "pseudo-class" with methods for operating on BUILD_VECTORs.
LLVM_ABI bool isConstantSplat(APInt &SplatValue, APInt &SplatUndef, unsigned &SplatBitSize, bool &HasAnyUndefs, unsigned MinSplatBits=0, bool isBigEndian=false) const
Check if this is a constant splat, and if so, find the smallest element size that splats the vector.
uint64_t getZExtValue() const
int64_t getSExtValue() const
FunctionPass class - This class is used to implement most global optimizations.
Definition Pass.h:314
LoongArchDAGToDAGISelLegacy(LoongArchTargetMachine &TM, CodeGenOptLevel OptLevel)
bool selectNonFIBaseAddr(SDValue Addr, SDValue &Base)
bool selectSExti32(SDValue N, SDValue &Val)
bool SelectInlineAsmMemoryOperand(const SDValue &Op, InlineAsm::ConstraintCode ConstraintID, std::vector< SDValue > &OutOps) override
SelectInlineAsmMemoryOperand - Select the specified address as a target addressing mode,...
bool selectVSplatUimmPow2(SDValue N, SDValue &SplatImm) const
bool selectShiftMask(SDValue N, unsigned ShiftWidth, SDValue &ShAmt)
bool selectZExti32(SDValue N, SDValue &Val)
bool SelectAddrRegImm12(SDValue Addr, SDValue &Base, SDValue &Offset)
bool SelectAddrConstant(SDValue Addr, SDValue &Base, SDValue &Offset)
bool selectVSplat(SDNode *N, APInt &Imm, unsigned MinSizeInBits) const
bool selectVSplatImm(SDValue N, SDValue &SplatVal)
bool selectVSplatUimmInvPow2(SDValue N, SDValue &SplatImm) const
bool SelectBaseAddr(SDValue Addr, SDValue &Base)
std::pair< bool, uint64_t > isImmVLDILegalForMode1(const APInt &SplatValue, const unsigned SplatBitSize) const
Check if a constant splat can be generated using [x]vldi, where imm[12] is 1.
Machine Value Type.
bool is128BitVector() const
Return true if this is a 128-bit vector type.
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
bool is256BitVector() const
Return true if this is a 256-bit vector type.
An SDNode that represents everything that will be needed to construct a MachineInstr.
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
const SDValue & getOperand(unsigned i) const
MVT getSimpleValueType() const
Return the simple ValueType of the referenced return value.
SelectionDAGISelLegacy(char &ID, std::unique_ptr< SelectionDAGISel > S)
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
@ SIGN_EXTEND_INREG
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
Definition ISDOpcodes.h:870
@ AND
Bitwise operators - logical and, logical or, logical xor.
Definition ISDOpcodes.h:730
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
Definition ISDOpcodes.h:543
InstSeq generateInstSeq(int64_t Val)
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:477
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
Definition MathExtras.h:174
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:649
bool isAligned(Align Lhs, uint64_t SizeInBytes)
Checks that SizeInBytes is a multiple of the alignment.
Definition Alignment.h:134
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
Definition MathExtras.h:342
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:288
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:82
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:548
FunctionPass * createLoongArchISelDag(LoongArchTargetMachine &TM, CodeGenOptLevel OptLevel)
DWARFExpression::Operation Op
constexpr int32_t SignExtend32(uint32_t X)
Sign-extend the number in the bottom B bits of X to a 32-bit integer.
Definition MathExtras.h:565
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:565
constexpr bool isIntN(unsigned N, int64_t x)
Checks if an signed integer fits into the given (dynamic) bit width.
Definition MathExtras.h:257
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
Definition MathExtras.h:583
unsigned Log2(Align A)
Returns the log2 of the alignment.
Definition Alignment.h:197
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:870
#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
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
Definition ValueTypes.h:373
bool is128BitVector() const
Return true if this is a 128-bit vector type.
Definition ValueTypes.h:207
bool is256BitVector() const
Return true if this is a 256-bit vector type.
Definition ValueTypes.h:212
EVT getVectorElementType() const
Given a vector type, return the type of each element.
Definition ValueTypes.h:328