1 //===- lib/CodeGen/GlobalISel/LegalizerMutations.cpp - Mutations ----------===//
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
7 //===----------------------------------------------------------------------===//
9 // A library of mutation factories to use for LegalityMutation.
11 //===----------------------------------------------------------------------===//
13 #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
17 LegalizeMutation
LegalizeMutations::changeTo(unsigned TypeIdx
, LLT Ty
) {
19 [=](const LegalityQuery
&Query
) { return std::make_pair(TypeIdx
, Ty
); };
22 LegalizeMutation
LegalizeMutations::changeTo(unsigned TypeIdx
,
23 unsigned FromTypeIdx
) {
24 return [=](const LegalityQuery
&Query
) {
25 return std::make_pair(TypeIdx
, Query
.Types
[FromTypeIdx
]);
29 LegalizeMutation
LegalizeMutations::changeElementTo(unsigned TypeIdx
,
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
));
38 LegalizeMutation
LegalizeMutations::changeElementTo(unsigned TypeIdx
,
40 return [=](const LegalityQuery
&Query
) {
41 const LLT OldTy
= Query
.Types
[TypeIdx
];
42 return std::make_pair(TypeIdx
, OldTy
.changeElementType(NewEltTy
));
46 LegalizeMutation
LegalizeMutations::widenScalarOrEltToNextPow2(unsigned TypeIdx
,
48 return [=](const LegalityQuery
&Query
) {
49 const LLT Ty
= Query
.Types
[TypeIdx
];
50 unsigned NewEltSizeInBits
=
51 std::max(1u << Log2_32_Ceil(Ty
.getScalarSizeInBits()), Min
);
52 return std::make_pair(TypeIdx
, Ty
.changeElementSize(NewEltSizeInBits
));
56 LegalizeMutation
LegalizeMutations::moreElementsToNextPow2(unsigned TypeIdx
,
58 return [=](const LegalityQuery
&Query
) {
59 const LLT VecTy
= Query
.Types
[TypeIdx
];
60 unsigned NewNumElements
=
61 std::max(1u << Log2_32_Ceil(VecTy
.getNumElements()), Min
);
62 return std::make_pair(TypeIdx
,
63 LLT::vector(NewNumElements
, VecTy
.getElementType()));
67 LegalizeMutation
LegalizeMutations::scalarize(unsigned TypeIdx
) {
68 return [=](const LegalityQuery
&Query
) {
69 return std::make_pair(TypeIdx
, Query
.Types
[TypeIdx
].getElementType());