1//===----------- ValueTypes.cpp - Implementation of EVT methods -----------===//
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#include "llvm/CodeGen/ValueTypes.h"
10#include "llvm/ADT/StringExtras.h"
11#include "llvm/IR/DerivedTypes.h"
12#include "llvm/IR/Type.h"
13#include "llvm/Support/ErrorHandling.h"
14#include "llvm/Support/TypeSize.h"
15using namespace llvm;
16
17EVT EVT::changeExtendedTypeToInteger() const {
18  LLVMContext &Context = LLVMTy->getContext();
19  return getIntegerVT(Context, getSizeInBits());
20}
21
22EVT EVT::changeExtendedVectorElementTypeToInteger() const {
23  LLVMContext &Context = LLVMTy->getContext();
24  EVT IntTy = getIntegerVT(Context, getScalarSizeInBits());
25  return getVectorVT(Context, IntTy, getVectorNumElements(),
26                     isScalableVector());
27}
28
29EVT EVT::changeExtendedVectorElementType(EVT EltVT) const {
30  LLVMContext &Context = LLVMTy->getContext();
31  return getVectorVT(Context, EltVT, getVectorElementCount());
32}
33
34EVT EVT::getExtendedIntegerVT(LLVMContext &Context, unsigned BitWidth) {
35  EVT VT;
36  VT.LLVMTy = IntegerType::get(Context, BitWidth);
37  assert(VT.isExtended() && "Type is not extended!");
38  return VT;
39}
40
41EVT EVT::getExtendedVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements,
42                             bool IsScalable) {
43  EVT ResultVT;
44  ResultVT.LLVMTy =
45      VectorType::get(VT.getTypeForEVT(Context), NumElements, IsScalable);
46  assert(ResultVT.isExtended() && "Type is not extended!");
47  return ResultVT;
48}
49
50EVT EVT::getExtendedVectorVT(LLVMContext &Context, EVT VT, ElementCount EC) {
51  EVT ResultVT;
52  ResultVT.LLVMTy =
53      VectorType::get(VT.getTypeForEVT(Context), {EC.Min, EC.Scalable});
54  assert(ResultVT.isExtended() && "Type is not extended!");
55  return ResultVT;
56}
57
58bool EVT::isExtendedFloatingPoint() const {
59  assert(isExtended() && "Type is not extended!");
60  return LLVMTy->isFPOrFPVectorTy();
61}
62
63bool EVT::isExtendedInteger() const {
64  assert(isExtended() && "Type is not extended!");
65  return LLVMTy->isIntOrIntVectorTy();
66}
67
68bool EVT::isExtendedScalarInteger() const {
69  assert(isExtended() && "Type is not extended!");
70  return LLVMTy->isIntegerTy();
71}
72
73bool EVT::isExtendedVector() const {
74  assert(isExtended() && "Type is not extended!");
75  return LLVMTy->isVectorTy();
76}
77
78bool EVT::isExtended16BitVector() const {
79  return isExtendedVector() && getExtendedSizeInBits() == 16;
80}
81
82bool EVT::isExtended32BitVector() const {
83  return isExtendedVector() && getExtendedSizeInBits() == 32;
84}
85
86bool EVT::isExtended64BitVector() const {
87  return isExtendedVector() && getExtendedSizeInBits() == 64;
88}
89
90bool EVT::isExtended128BitVector() const {
91  return isExtendedVector() && getExtendedSizeInBits() == 128;
92}
93
94bool EVT::isExtended256BitVector() const {
95  return isExtendedVector() && getExtendedSizeInBits() == 256;
96}
97
98bool EVT::isExtended512BitVector() const {
99  return isExtendedVector() && getExtendedSizeInBits() == 512;
100}
101
102bool EVT::isExtended1024BitVector() const {
103  return isExtendedVector() && getExtendedSizeInBits() == 1024;
104}
105
106bool EVT::isExtended2048BitVector() const {
107  return isExtendedVector() && getExtendedSizeInBits() == 2048;
108}
109
110bool EVT::isExtendedFixedLengthVector() const {
111  return isExtendedVector() && isa<FixedVectorType>(LLVMTy);
112}
113
114bool EVT::isExtendedScalableVector() const {
115  return isExtendedVector() && isa<ScalableVectorType>(LLVMTy);
116}
117
118EVT EVT::getExtendedVectorElementType() const {
119  assert(isExtended() && "Type is not extended!");
120  return EVT::getEVT(cast<VectorType>(LLVMTy)->getElementType());
121}
122
123unsigned EVT::getExtendedVectorNumElements() const {
124  assert(isExtended() && "Type is not extended!");
125  ElementCount EC = cast<VectorType>(LLVMTy)->getElementCount();
126  if (EC.Scalable) {
127    WithColor::warning()
128        << "The code that requested the fixed number of elements has made the "
129           "assumption that this vector is not scalable. This assumption was "
130           "not correct, and this may lead to broken code\n";
131  }
132  return EC.Min;
133}
134
135ElementCount EVT::getExtendedVectorElementCount() const {
136  assert(isExtended() && "Type is not extended!");
137  return cast<VectorType>(LLVMTy)->getElementCount();
138}
139
140TypeSize EVT::getExtendedSizeInBits() const {
141  assert(isExtended() && "Type is not extended!");
142  if (IntegerType *ITy = dyn_cast<IntegerType>(LLVMTy))
143    return TypeSize::Fixed(ITy->getBitWidth());
144  if (VectorType *VTy = dyn_cast<VectorType>(LLVMTy))
145    return VTy->getPrimitiveSizeInBits();
146  llvm_unreachable("Unrecognized extended type!");
147}
148
149/// getEVTString - This function returns value type as a string, e.g. "i32".
150std::string EVT::getEVTString() const {
151  switch (V.SimpleTy) {
152  default:
153    if (isVector())
154      return (isScalableVector() ? "nxv" : "v")
155             + utostr(getVectorElementCount().Min)
156             + getVectorElementType().getEVTString();
157    if (isInteger())
158      return "i" + utostr(getSizeInBits());
159    if (isFloatingPoint())
160      return "f" + utostr(getSizeInBits());
161    llvm_unreachable("Invalid EVT!");
162  case MVT::bf16:    return "bf16";
163  case MVT::ppcf128: return "ppcf128";
164  case MVT::isVoid:  return "isVoid";
165  case MVT::Other:   return "ch";
166  case MVT::Glue:    return "glue";
167  case MVT::x86mmx:  return "x86mmx";
168  case MVT::Metadata:return "Metadata";
169  case MVT::Untyped: return "Untyped";
170  case MVT::exnref : return "exnref";
171  }
172}
173
174/// getTypeForEVT - This method returns an LLVM type corresponding to the
175/// specified EVT.  For integer types, this returns an unsigned type.  Note
176/// that this will abort for types that cannot be represented.
177Type *EVT::getTypeForEVT(LLVMContext &Context) const {
178  switch (V.SimpleTy) {
179  default:
180    assert(isExtended() && "Type is not extended!");
181    return LLVMTy;
182  case MVT::isVoid:  return Type::getVoidTy(Context);
183  case MVT::i1:      return Type::getInt1Ty(Context);
184  case MVT::i8:      return Type::getInt8Ty(Context);
185  case MVT::i16:     return Type::getInt16Ty(Context);
186  case MVT::i32:     return Type::getInt32Ty(Context);
187  case MVT::i64:     return Type::getInt64Ty(Context);
188  case MVT::i128:    return IntegerType::get(Context, 128);
189  case MVT::f16:     return Type::getHalfTy(Context);
190  case MVT::bf16:     return Type::getBFloatTy(Context);
191  case MVT::f32:     return Type::getFloatTy(Context);
192  case MVT::f64:     return Type::getDoubleTy(Context);
193  case MVT::f80:     return Type::getX86_FP80Ty(Context);
194  case MVT::f128:    return Type::getFP128Ty(Context);
195  case MVT::ppcf128: return Type::getPPC_FP128Ty(Context);
196  case MVT::x86mmx:  return Type::getX86_MMXTy(Context);
197  case MVT::v1i1:
198    return FixedVectorType::get(Type::getInt1Ty(Context), 1);
199  case MVT::v2i1:
200    return FixedVectorType::get(Type::getInt1Ty(Context), 2);
201  case MVT::v4i1:
202    return FixedVectorType::get(Type::getInt1Ty(Context), 4);
203  case MVT::v8i1:
204    return FixedVectorType::get(Type::getInt1Ty(Context), 8);
205  case MVT::v16i1:
206    return FixedVectorType::get(Type::getInt1Ty(Context), 16);
207  case MVT::v32i1:
208    return FixedVectorType::get(Type::getInt1Ty(Context), 32);
209  case MVT::v64i1:
210    return FixedVectorType::get(Type::getInt1Ty(Context), 64);
211  case MVT::v128i1:
212    return FixedVectorType::get(Type::getInt1Ty(Context), 128);
213  case MVT::v256i1:
214    return FixedVectorType::get(Type::getInt1Ty(Context), 256);
215  case MVT::v512i1:
216    return FixedVectorType::get(Type::getInt1Ty(Context), 512);
217  case MVT::v1024i1:
218    return FixedVectorType::get(Type::getInt1Ty(Context), 1024);
219  case MVT::v1i8:
220    return FixedVectorType::get(Type::getInt8Ty(Context), 1);
221  case MVT::v2i8:
222    return FixedVectorType::get(Type::getInt8Ty(Context), 2);
223  case MVT::v4i8:
224    return FixedVectorType::get(Type::getInt8Ty(Context), 4);
225  case MVT::v8i8:
226    return FixedVectorType::get(Type::getInt8Ty(Context), 8);
227  case MVT::v16i8:
228    return FixedVectorType::get(Type::getInt8Ty(Context), 16);
229  case MVT::v32i8:
230    return FixedVectorType::get(Type::getInt8Ty(Context), 32);
231  case MVT::v64i8:
232    return FixedVectorType::get(Type::getInt8Ty(Context), 64);
233  case MVT::v128i8:
234    return FixedVectorType::get(Type::getInt8Ty(Context), 128);
235  case MVT::v256i8:
236    return FixedVectorType::get(Type::getInt8Ty(Context), 256);
237  case MVT::v1i16:
238    return FixedVectorType::get(Type::getInt16Ty(Context), 1);
239  case MVT::v2i16:
240    return FixedVectorType::get(Type::getInt16Ty(Context), 2);
241  case MVT::v3i16:
242    return FixedVectorType::get(Type::getInt16Ty(Context), 3);
243  case MVT::v4i16:
244    return FixedVectorType::get(Type::getInt16Ty(Context), 4);
245  case MVT::v8i16:
246    return FixedVectorType::get(Type::getInt16Ty(Context), 8);
247  case MVT::v16i16:
248    return FixedVectorType::get(Type::getInt16Ty(Context), 16);
249  case MVT::v32i16:
250    return FixedVectorType::get(Type::getInt16Ty(Context), 32);
251  case MVT::v64i16:
252    return FixedVectorType::get(Type::getInt16Ty(Context), 64);
253  case MVT::v128i16:
254    return FixedVectorType::get(Type::getInt16Ty(Context), 128);
255  case MVT::v1i32:
256    return FixedVectorType::get(Type::getInt32Ty(Context), 1);
257  case MVT::v2i32:
258    return FixedVectorType::get(Type::getInt32Ty(Context), 2);
259  case MVT::v3i32:
260    return FixedVectorType::get(Type::getInt32Ty(Context), 3);
261  case MVT::v4i32:
262    return FixedVectorType::get(Type::getInt32Ty(Context), 4);
263  case MVT::v5i32:
264    return FixedVectorType::get(Type::getInt32Ty(Context), 5);
265  case MVT::v8i32:
266    return FixedVectorType::get(Type::getInt32Ty(Context), 8);
267  case MVT::v16i32:
268    return FixedVectorType::get(Type::getInt32Ty(Context), 16);
269  case MVT::v32i32:
270    return FixedVectorType::get(Type::getInt32Ty(Context), 32);
271  case MVT::v64i32:
272    return FixedVectorType::get(Type::getInt32Ty(Context), 64);
273  case MVT::v128i32:
274    return FixedVectorType::get(Type::getInt32Ty(Context), 128);
275  case MVT::v256i32:
276    return FixedVectorType::get(Type::getInt32Ty(Context), 256);
277  case MVT::v512i32:
278    return FixedVectorType::get(Type::getInt32Ty(Context), 512);
279  case MVT::v1024i32:
280    return FixedVectorType::get(Type::getInt32Ty(Context), 1024);
281  case MVT::v2048i32:
282    return FixedVectorType::get(Type::getInt32Ty(Context), 2048);
283  case MVT::v1i64:
284    return FixedVectorType::get(Type::getInt64Ty(Context), 1);
285  case MVT::v2i64:
286    return FixedVectorType::get(Type::getInt64Ty(Context), 2);
287  case MVT::v4i64:
288    return FixedVectorType::get(Type::getInt64Ty(Context), 4);
289  case MVT::v8i64:
290    return FixedVectorType::get(Type::getInt64Ty(Context), 8);
291  case MVT::v16i64:
292    return FixedVectorType::get(Type::getInt64Ty(Context), 16);
293  case MVT::v32i64:
294    return FixedVectorType::get(Type::getInt64Ty(Context), 32);
295  case MVT::v1i128:
296    return FixedVectorType::get(Type::getInt128Ty(Context), 1);
297  case MVT::v2f16:
298    return FixedVectorType::get(Type::getHalfTy(Context), 2);
299  case MVT::v3f16:
300    return FixedVectorType::get(Type::getHalfTy(Context), 3);
301  case MVT::v4f16:
302    return FixedVectorType::get(Type::getHalfTy(Context), 4);
303  case MVT::v8f16:
304    return FixedVectorType::get(Type::getHalfTy(Context), 8);
305  case MVT::v16f16:
306    return FixedVectorType::get(Type::getHalfTy(Context), 16);
307  case MVT::v32f16:
308    return FixedVectorType::get(Type::getHalfTy(Context), 32);
309  case MVT::v64f16:
310    return FixedVectorType::get(Type::getBFloatTy(Context), 64);
311  case MVT::v128f16:
312    return FixedVectorType::get(Type::getBFloatTy(Context), 128);
313  case MVT::v2bf16:
314    return FixedVectorType::get(Type::getBFloatTy(Context), 2);
315  case MVT::v3bf16:
316    return FixedVectorType::get(Type::getBFloatTy(Context), 3);
317  case MVT::v4bf16:
318    return FixedVectorType::get(Type::getBFloatTy(Context), 4);
319  case MVT::v8bf16:
320    return FixedVectorType::get(Type::getBFloatTy(Context), 8);
321  case MVT::v16bf16:
322    return FixedVectorType::get(Type::getBFloatTy(Context), 16);
323  case MVT::v32bf16:
324    return FixedVectorType::get(Type::getBFloatTy(Context), 32);
325  case MVT::v64bf16:
326    return FixedVectorType::get(Type::getBFloatTy(Context), 64);
327  case MVT::v128bf16:
328    return FixedVectorType::get(Type::getBFloatTy(Context), 128);
329  case MVT::v1f32:
330    return FixedVectorType::get(Type::getFloatTy(Context), 1);
331  case MVT::v2f32:
332    return FixedVectorType::get(Type::getFloatTy(Context), 2);
333  case MVT::v3f32:
334    return FixedVectorType::get(Type::getFloatTy(Context), 3);
335  case MVT::v4f32:
336    return FixedVectorType::get(Type::getFloatTy(Context), 4);
337  case MVT::v5f32:
338    return FixedVectorType::get(Type::getFloatTy(Context), 5);
339  case MVT::v8f32:
340    return FixedVectorType::get(Type::getFloatTy(Context), 8);
341  case MVT::v16f32:
342    return FixedVectorType::get(Type::getFloatTy(Context), 16);
343  case MVT::v32f32:
344    return FixedVectorType::get(Type::getFloatTy(Context), 32);
345  case MVT::v64f32:
346    return FixedVectorType::get(Type::getFloatTy(Context), 64);
347  case MVT::v128f32:
348    return FixedVectorType::get(Type::getFloatTy(Context), 128);
349  case MVT::v256f32:
350    return FixedVectorType::get(Type::getFloatTy(Context), 256);
351  case MVT::v512f32:
352    return FixedVectorType::get(Type::getFloatTy(Context), 512);
353  case MVT::v1024f32:
354    return FixedVectorType::get(Type::getFloatTy(Context), 1024);
355  case MVT::v2048f32:
356    return FixedVectorType::get(Type::getFloatTy(Context), 2048);
357  case MVT::v1f64:
358    return FixedVectorType::get(Type::getDoubleTy(Context), 1);
359  case MVT::v2f64:
360    return FixedVectorType::get(Type::getDoubleTy(Context), 2);
361  case MVT::v4f64:
362    return FixedVectorType::get(Type::getDoubleTy(Context), 4);
363  case MVT::v8f64:
364    return FixedVectorType::get(Type::getDoubleTy(Context), 8);
365  case MVT::v16f64:
366    return FixedVectorType::get(Type::getDoubleTy(Context), 16);
367  case MVT::v32f64:
368    return FixedVectorType::get(Type::getDoubleTy(Context), 32);
369  case MVT::nxv1i1:
370    return ScalableVectorType::get(Type::getInt1Ty(Context), 1);
371  case MVT::nxv2i1:
372    return ScalableVectorType::get(Type::getInt1Ty(Context), 2);
373  case MVT::nxv4i1:
374    return ScalableVectorType::get(Type::getInt1Ty(Context), 4);
375  case MVT::nxv8i1:
376    return ScalableVectorType::get(Type::getInt1Ty(Context), 8);
377  case MVT::nxv16i1:
378    return ScalableVectorType::get(Type::getInt1Ty(Context), 16);
379  case MVT::nxv32i1:
380    return ScalableVectorType::get(Type::getInt1Ty(Context), 32);
381  case MVT::nxv64i1:
382    return ScalableVectorType::get(Type::getInt1Ty(Context), 64);
383  case MVT::nxv1i8:
384    return ScalableVectorType::get(Type::getInt8Ty(Context), 1);
385  case MVT::nxv2i8:
386    return ScalableVectorType::get(Type::getInt8Ty(Context), 2);
387  case MVT::nxv4i8:
388    return ScalableVectorType::get(Type::getInt8Ty(Context), 4);
389  case MVT::nxv8i8:
390    return ScalableVectorType::get(Type::getInt8Ty(Context), 8);
391  case MVT::nxv16i8:
392    return ScalableVectorType::get(Type::getInt8Ty(Context), 16);
393  case MVT::nxv32i8:
394    return ScalableVectorType::get(Type::getInt8Ty(Context), 32);
395  case MVT::nxv64i8:
396    return ScalableVectorType::get(Type::getInt8Ty(Context), 64);
397  case MVT::nxv1i16:
398    return ScalableVectorType::get(Type::getInt16Ty(Context), 1);
399  case MVT::nxv2i16:
400    return ScalableVectorType::get(Type::getInt16Ty(Context), 2);
401  case MVT::nxv4i16:
402    return ScalableVectorType::get(Type::getInt16Ty(Context), 4);
403  case MVT::nxv8i16:
404    return ScalableVectorType::get(Type::getInt16Ty(Context), 8);
405  case MVT::nxv16i16:
406    return ScalableVectorType::get(Type::getInt16Ty(Context), 16);
407  case MVT::nxv32i16:
408    return ScalableVectorType::get(Type::getInt16Ty(Context), 32);
409  case MVT::nxv1i32:
410    return ScalableVectorType::get(Type::getInt32Ty(Context), 1);
411  case MVT::nxv2i32:
412    return ScalableVectorType::get(Type::getInt32Ty(Context), 2);
413  case MVT::nxv4i32:
414    return ScalableVectorType::get(Type::getInt32Ty(Context), 4);
415  case MVT::nxv8i32:
416    return ScalableVectorType::get(Type::getInt32Ty(Context), 8);
417  case MVT::nxv16i32:
418    return ScalableVectorType::get(Type::getInt32Ty(Context), 16);
419  case MVT::nxv32i32:
420    return ScalableVectorType::get(Type::getInt32Ty(Context), 32);
421  case MVT::nxv1i64:
422    return ScalableVectorType::get(Type::getInt64Ty(Context), 1);
423  case MVT::nxv2i64:
424    return ScalableVectorType::get(Type::getInt64Ty(Context), 2);
425  case MVT::nxv4i64:
426    return ScalableVectorType::get(Type::getInt64Ty(Context), 4);
427  case MVT::nxv8i64:
428    return ScalableVectorType::get(Type::getInt64Ty(Context), 8);
429  case MVT::nxv16i64:
430    return ScalableVectorType::get(Type::getInt64Ty(Context), 16);
431  case MVT::nxv32i64:
432    return ScalableVectorType::get(Type::getInt64Ty(Context), 32);
433  case MVT::nxv1f16:
434    return ScalableVectorType::get(Type::getHalfTy(Context), 1);
435  case MVT::nxv2f16:
436    return ScalableVectorType::get(Type::getHalfTy(Context), 2);
437  case MVT::nxv4f16:
438    return ScalableVectorType::get(Type::getHalfTy(Context), 4);
439  case MVT::nxv8f16:
440    return ScalableVectorType::get(Type::getHalfTy(Context), 8);
441  case MVT::nxv16f16:
442    return ScalableVectorType::get(Type::getHalfTy(Context), 16);
443  case MVT::nxv32f16:
444    return ScalableVectorType::get(Type::getHalfTy(Context), 32);
445  case MVT::nxv2bf16:
446    return ScalableVectorType::get(Type::getBFloatTy(Context), 2);
447  case MVT::nxv4bf16:
448    return ScalableVectorType::get(Type::getBFloatTy(Context), 4);
449  case MVT::nxv8bf16:
450    return ScalableVectorType::get(Type::getBFloatTy(Context), 8);
451  case MVT::nxv1f32:
452    return ScalableVectorType::get(Type::getFloatTy(Context), 1);
453  case MVT::nxv2f32:
454    return ScalableVectorType::get(Type::getFloatTy(Context), 2);
455  case MVT::nxv4f32:
456    return ScalableVectorType::get(Type::getFloatTy(Context), 4);
457  case MVT::nxv8f32:
458    return ScalableVectorType::get(Type::getFloatTy(Context), 8);
459  case MVT::nxv16f32:
460    return ScalableVectorType::get(Type::getFloatTy(Context), 16);
461  case MVT::nxv1f64:
462    return ScalableVectorType::get(Type::getDoubleTy(Context), 1);
463  case MVT::nxv2f64:
464    return ScalableVectorType::get(Type::getDoubleTy(Context), 2);
465  case MVT::nxv4f64:
466    return ScalableVectorType::get(Type::getDoubleTy(Context), 4);
467  case MVT::nxv8f64:
468    return ScalableVectorType::get(Type::getDoubleTy(Context), 8);
469  case MVT::Metadata: return Type::getMetadataTy(Context);
470  }
471}
472
473/// Return the value type corresponding to the specified type.  This returns all
474/// pointers as MVT::iPTR.  If HandleUnknown is true, unknown types are returned
475/// as Other, otherwise they are invalid.
476MVT MVT::getVT(Type *Ty, bool HandleUnknown){
477  switch (Ty->getTypeID()) {
478  default:
479    if (HandleUnknown) return MVT(MVT::Other);
480    llvm_unreachable("Unknown type!");
481  case Type::VoidTyID:
482    return MVT::isVoid;
483  case Type::IntegerTyID:
484    return getIntegerVT(cast<IntegerType>(Ty)->getBitWidth());
485  case Type::HalfTyID:      return MVT(MVT::f16);
486  case Type::BFloatTyID:    return MVT(MVT::bf16);
487  case Type::FloatTyID:     return MVT(MVT::f32);
488  case Type::DoubleTyID:    return MVT(MVT::f64);
489  case Type::X86_FP80TyID:  return MVT(MVT::f80);
490  case Type::X86_MMXTyID:   return MVT(MVT::x86mmx);
491  case Type::FP128TyID:     return MVT(MVT::f128);
492  case Type::PPC_FP128TyID: return MVT(MVT::ppcf128);
493  case Type::PointerTyID:   return MVT(MVT::iPTR);
494  case Type::FixedVectorTyID:
495  case Type::ScalableVectorTyID: {
496    VectorType *VTy = cast<VectorType>(Ty);
497    return getVectorVT(
498      getVT(VTy->getElementType(), /*HandleUnknown=*/ false),
499            VTy->getElementCount());
500  }
501  }
502}
503
504/// getEVT - Return the value type corresponding to the specified type.  This
505/// returns all pointers as MVT::iPTR.  If HandleUnknown is true, unknown types
506/// are returned as Other, otherwise they are invalid.
507EVT EVT::getEVT(Type *Ty, bool HandleUnknown){
508  switch (Ty->getTypeID()) {
509  default:
510    return MVT::getVT(Ty, HandleUnknown);
511  case Type::IntegerTyID:
512    return getIntegerVT(Ty->getContext(), cast<IntegerType>(Ty)->getBitWidth());
513  case Type::FixedVectorTyID:
514  case Type::ScalableVectorTyID: {
515    VectorType *VTy = cast<VectorType>(Ty);
516    return getVectorVT(Ty->getContext(),
517                       getEVT(VTy->getElementType(), /*HandleUnknown=*/ false),
518                       VTy->getElementCount());
519  }
520  }
521}
522