LLVM 20.0.0git
VectorTypeUtils.cpp
Go to the documentation of this file.
1//===------- VectorTypeUtils.cpp - Vector type utility functions ----------===//
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
11
12using namespace llvm;
13
14/// A helper for converting structs of scalar types to structs of vector types.
15/// Note: Only unpacked literal struct types are supported.
17 if (EC.isScalar())
18 return StructTy;
20 "expected unpacked struct literal");
21 assert(all_of(StructTy->elements(), VectorType::isValidElementType) &&
22 "expected all element types to be valid vector element types");
23 return StructType::get(
24 StructTy->getContext(),
25 map_to_vector(StructTy->elements(), [&](Type *ElTy) -> Type * {
26 return VectorType::get(ElTy, EC);
27 }));
28}
29
30/// A helper for converting structs of vector types to structs of scalar types.
31/// Note: Only unpacked literal struct types are supported.
34 "expected unpacked struct literal");
35 return StructType::get(
36 StructTy->getContext(),
37 map_to_vector(StructTy->elements(), [](Type *ElTy) -> Type * {
38 return ElTy->getScalarType();
39 }));
40}
41
42/// Returns true if `StructTy` is an unpacked literal struct where all elements
43/// are vectors of matching element count. This does not include empty structs.
45 if (!isUnpackedStructLiteral(StructTy))
46 return false;
47 auto ElemTys = StructTy->elements();
48 if (ElemTys.empty() || !ElemTys.front()->isVectorTy())
49 return false;
50 ElementCount VF = cast<VectorType>(ElemTys.front())->getElementCount();
51 return all_of(ElemTys, [&](Type *Ty) {
52 return Ty->isVectorTy() && cast<VectorType>(Ty)->getElementCount() == VF;
53 });
54}
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines less commonly used SmallVector utilities.
Class to represent struct types.
Definition: DerivedTypes.h:218
static StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
Definition: Type.cpp:406
ArrayRef< Type * > elements() const
Definition: DerivedTypes.h:357
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
bool isVectorTy() const
True if this is an instance of VectorType.
Definition: Type.h:270
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition: Type.h:128
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1739
bool isUnpackedStructLiteral(StructType *StructTy)
auto map_to_vector(ContainerTy &&C, FuncTy &&F)
Map a range to a SmallVector with element types deduced from the mapping.
Type * toVectorizedStructTy(StructType *StructTy, ElementCount EC)
A helper for converting structs of scalar types to structs of vector types.
Type * toScalarizedStructTy(StructType *StructTy)
A helper for converting structs of vector types to structs of scalar types.
bool isVectorizedStructTy(StructType *StructTy)
Returns true if StructTy is an unpacked literal struct where all elements are vectors of matching ele...