LLVM 19.0.0git
LegalizeMutations.cpp
Go to the documentation of this file.
1//===- lib/CodeGen/GlobalISel/LegalizerMutations.cpp - Mutations ----------===//
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// A library of mutation factories to use for LegalityMutation.
10//
11//===----------------------------------------------------------------------===//
12
14
15using namespace llvm;
16
18 return
19 [=](const LegalityQuery &Query) { return std::make_pair(TypeIdx, Ty); };
20}
21
23 unsigned FromTypeIdx) {
24 return [=](const LegalityQuery &Query) {
25 return std::make_pair(TypeIdx, Query.Types[FromTypeIdx]);
26 };
27}
28
30 unsigned FromTypeIdx) {
31 return [=](const LegalityQuery &Query) {
32 const LLT OldTy = Query.Types[TypeIdx];
33 const LLT NewTy = Query.Types[FromTypeIdx];
34 return std::make_pair(TypeIdx, OldTy.changeElementType(NewTy));
35 };
36}
37
39 LLT NewEltTy) {
40 return [=](const LegalityQuery &Query) {
41 const LLT OldTy = Query.Types[TypeIdx];
42 return std::make_pair(TypeIdx, OldTy.changeElementType(NewEltTy));
43 };
44}
45
47 unsigned FromTypeIdx) {
48 return [=](const LegalityQuery &Query) {
49 const LLT OldTy = Query.Types[TypeIdx];
50 const LLT NewTy = Query.Types[FromTypeIdx];
51 ElementCount NewEltCount =
52 NewTy.isVector() ? NewTy.getElementCount() : ElementCount::getFixed(1);
53 return std::make_pair(TypeIdx, OldTy.changeElementCount(NewEltCount));
54 };
55}
56
58 LLT NewEltTy) {
59 return [=](const LegalityQuery &Query) {
60 const LLT OldTy = Query.Types[TypeIdx];
61 ElementCount NewEltCount = NewEltTy.isVector() ? NewEltTy.getElementCount()
63 return std::make_pair(TypeIdx, OldTy.changeElementCount(NewEltCount));
64 };
65}
66
68 unsigned FromTypeIdx) {
69 return [=](const LegalityQuery &Query) {
70 const LLT OldTy = Query.Types[TypeIdx];
71 const LLT NewTy = Query.Types[FromTypeIdx];
72 const LLT NewEltTy = LLT::scalar(NewTy.getScalarSizeInBits());
73 return std::make_pair(TypeIdx, OldTy.changeElementType(NewEltTy));
74 };
75}
76
78 unsigned Min) {
79 return [=](const LegalityQuery &Query) {
80 const LLT Ty = Query.Types[TypeIdx];
81 unsigned NewEltSizeInBits =
82 std::max(1u << Log2_32_Ceil(Ty.getScalarSizeInBits()), Min);
83 return std::make_pair(TypeIdx, Ty.changeElementSize(NewEltSizeInBits));
84 };
85}
86
89 unsigned Size) {
90 return [=](const LegalityQuery &Query) {
91 const LLT Ty = Query.Types[TypeIdx];
92 unsigned NewEltSizeInBits = alignTo(Ty.getScalarSizeInBits(), Size);
93 return std::make_pair(TypeIdx, Ty.changeElementSize(NewEltSizeInBits));
94 };
95}
96
98 unsigned Min) {
99 return [=](const LegalityQuery &Query) {
100 const LLT VecTy = Query.Types[TypeIdx];
101 unsigned NewNumElements =
102 std::max(1u << Log2_32_Ceil(VecTy.getNumElements()), Min);
103 return std::make_pair(
104 TypeIdx, LLT::fixed_vector(NewNumElements, VecTy.getElementType()));
105 };
106}
107
109 return [=](const LegalityQuery &Query) {
110 return std::make_pair(TypeIdx, Query.Types[TypeIdx].getElementType());
111 };
112}
uint64_t Size
Interface for Targets to specify which operations they can successfully select and how the others sho...
static constexpr ElementCount getFixed(ScalarTy MinVal)
Definition: TypeSize.h:296
constexpr unsigned getScalarSizeInBits() const
Definition: LowLevelType.h:267
constexpr LLT changeElementType(LLT NewEltTy) const
If this type is a vector, return a vector with the same number of elements but the new element type.
Definition: LowLevelType.h:214
static constexpr LLT scalar(unsigned SizeInBits)
Get a low-level scalar or aggregate "bag of bits".
Definition: LowLevelType.h:42
constexpr uint16_t getNumElements() const
Returns the number of elements in a vector LLT.
Definition: LowLevelType.h:159
constexpr bool isVector() const
Definition: LowLevelType.h:148
constexpr LLT getElementType() const
Returns the vector's element type. Only valid for vector types.
Definition: LowLevelType.h:290
constexpr ElementCount getElementCount() const
Definition: LowLevelType.h:184
constexpr LLT changeElementSize(unsigned NewEltSize) const
If this type is a vector, return a vector with the same number of elements but the new element size.
Definition: LowLevelType.h:221
static constexpr LLT fixed_vector(unsigned NumElements, unsigned ScalarSizeInBits)
Get a low-level fixed-width vector of some number of elements and element width.
Definition: LowLevelType.h:100
constexpr LLT changeElementCount(ElementCount EC) const
Return a vector or scalar with the same element type and the new element count.
Definition: LowLevelType.h:230
LegalizeMutation moreElementsToNextPow2(unsigned TypeIdx, unsigned Min=0)
Add more elements to the type for the given type index to the next power of.
LegalizeMutation changeElementCountTo(unsigned TypeIdx, unsigned FromTypeIdx)
Keep the same scalar or element type as TypeIdx, but take the number of elements from FromTypeIdx.
LegalizeMutation scalarize(unsigned TypeIdx)
Break up the vector type for the given type index into the element type.
LegalizeMutation changeElementTo(unsigned TypeIdx, unsigned FromTypeIdx)
Keep the same scalar or element type as the given type index.
LegalizeMutation widenScalarOrEltToNextPow2(unsigned TypeIdx, unsigned Min=0)
Widen the scalar type or vector element type for the given type index to the next power of 2.
LegalizeMutation changeTo(unsigned TypeIdx, LLT Ty)
Select this specific type for the given type index.
LegalizeMutation widenScalarOrEltToNextMultipleOf(unsigned TypeIdx, unsigned Size)
Widen the scalar type or vector element type for the given type index to next multiple of Size.
LegalizeMutation changeElementSizeTo(unsigned TypeIdx, unsigned FromTypeIdx)
Change the scalar size or element size to have the same scalar size as type index FromIndex.
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition: MathExtras.h:326
std::function< std::pair< unsigned, LLT >(const LegalityQuery &)> LegalizeMutation
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition: Alignment.h:155
The LegalityQuery object bundles together all the information that's needed to decide whether a given...