xref: /freebsd/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/LegalizeMutations.cpp (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
10b57cec5SDimitry Andric //===- lib/CodeGen/GlobalISel/LegalizerMutations.cpp - Mutations ----------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // A library of mutation factories to use for LegalityMutation.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
140b57cec5SDimitry Andric 
150b57cec5SDimitry Andric using namespace llvm;
160b57cec5SDimitry Andric 
changeTo(unsigned TypeIdx,LLT Ty)170b57cec5SDimitry Andric LegalizeMutation LegalizeMutations::changeTo(unsigned TypeIdx, LLT Ty) {
180b57cec5SDimitry Andric   return
190b57cec5SDimitry Andric       [=](const LegalityQuery &Query) { return std::make_pair(TypeIdx, Ty); };
200b57cec5SDimitry Andric }
210b57cec5SDimitry Andric 
changeTo(unsigned TypeIdx,unsigned FromTypeIdx)220b57cec5SDimitry Andric LegalizeMutation LegalizeMutations::changeTo(unsigned TypeIdx,
230b57cec5SDimitry Andric                                              unsigned FromTypeIdx) {
240b57cec5SDimitry Andric   return [=](const LegalityQuery &Query) {
250b57cec5SDimitry Andric     return std::make_pair(TypeIdx, Query.Types[FromTypeIdx]);
260b57cec5SDimitry Andric   };
270b57cec5SDimitry Andric }
280b57cec5SDimitry Andric 
changeElementTo(unsigned TypeIdx,unsigned FromTypeIdx)290b57cec5SDimitry Andric LegalizeMutation LegalizeMutations::changeElementTo(unsigned TypeIdx,
300b57cec5SDimitry Andric                                                     unsigned FromTypeIdx) {
310b57cec5SDimitry Andric   return [=](const LegalityQuery &Query) {
320b57cec5SDimitry Andric     const LLT OldTy = Query.Types[TypeIdx];
330b57cec5SDimitry Andric     const LLT NewTy = Query.Types[FromTypeIdx];
340b57cec5SDimitry Andric     return std::make_pair(TypeIdx, OldTy.changeElementType(NewTy));
350b57cec5SDimitry Andric   };
360b57cec5SDimitry Andric }
370b57cec5SDimitry Andric 
changeElementTo(unsigned TypeIdx,LLT NewEltTy)380b57cec5SDimitry Andric LegalizeMutation LegalizeMutations::changeElementTo(unsigned TypeIdx,
390b57cec5SDimitry Andric                                                     LLT NewEltTy) {
400b57cec5SDimitry Andric   return [=](const LegalityQuery &Query) {
410b57cec5SDimitry Andric     const LLT OldTy = Query.Types[TypeIdx];
420b57cec5SDimitry Andric     return std::make_pair(TypeIdx, OldTy.changeElementType(NewEltTy));
430b57cec5SDimitry Andric   };
440b57cec5SDimitry Andric }
450b57cec5SDimitry Andric 
changeElementCountTo(unsigned TypeIdx,unsigned FromTypeIdx)46*81ad6265SDimitry Andric LegalizeMutation LegalizeMutations::changeElementCountTo(unsigned TypeIdx,
47*81ad6265SDimitry Andric                                                          unsigned FromTypeIdx) {
48*81ad6265SDimitry Andric   return [=](const LegalityQuery &Query) {
49*81ad6265SDimitry Andric     const LLT OldTy = Query.Types[TypeIdx];
50*81ad6265SDimitry Andric     const LLT NewTy = Query.Types[FromTypeIdx];
51*81ad6265SDimitry Andric     ElementCount NewEltCount =
52*81ad6265SDimitry Andric         NewTy.isVector() ? NewTy.getElementCount() : ElementCount::getFixed(1);
53*81ad6265SDimitry Andric     return std::make_pair(TypeIdx, OldTy.changeElementCount(NewEltCount));
54*81ad6265SDimitry Andric   };
55*81ad6265SDimitry Andric }
56*81ad6265SDimitry Andric 
changeElementCountTo(unsigned TypeIdx,LLT NewEltTy)57*81ad6265SDimitry Andric LegalizeMutation LegalizeMutations::changeElementCountTo(unsigned TypeIdx,
58*81ad6265SDimitry Andric                                                          LLT NewEltTy) {
59*81ad6265SDimitry Andric   return [=](const LegalityQuery &Query) {
60*81ad6265SDimitry Andric     const LLT OldTy = Query.Types[TypeIdx];
61*81ad6265SDimitry Andric     ElementCount NewEltCount = NewEltTy.isVector() ? NewEltTy.getElementCount()
62*81ad6265SDimitry Andric                                                    : ElementCount::getFixed(1);
63*81ad6265SDimitry Andric     return std::make_pair(TypeIdx, OldTy.changeElementCount(NewEltCount));
64*81ad6265SDimitry Andric   };
65*81ad6265SDimitry Andric }
66*81ad6265SDimitry Andric 
changeElementSizeTo(unsigned TypeIdx,unsigned FromTypeIdx)67e8d8bef9SDimitry Andric LegalizeMutation LegalizeMutations::changeElementSizeTo(unsigned TypeIdx,
68e8d8bef9SDimitry Andric                                                         unsigned FromTypeIdx) {
69e8d8bef9SDimitry Andric   return [=](const LegalityQuery &Query) {
70e8d8bef9SDimitry Andric     const LLT OldTy = Query.Types[TypeIdx];
71e8d8bef9SDimitry Andric     const LLT NewTy = Query.Types[FromTypeIdx];
72e8d8bef9SDimitry Andric     const LLT NewEltTy = LLT::scalar(NewTy.getScalarSizeInBits());
73e8d8bef9SDimitry Andric     return std::make_pair(TypeIdx, OldTy.changeElementType(NewEltTy));
74e8d8bef9SDimitry Andric   };
75e8d8bef9SDimitry Andric }
76e8d8bef9SDimitry Andric 
widenScalarOrEltToNextPow2(unsigned TypeIdx,unsigned Min)770b57cec5SDimitry Andric LegalizeMutation LegalizeMutations::widenScalarOrEltToNextPow2(unsigned TypeIdx,
780b57cec5SDimitry Andric                                                                unsigned Min) {
790b57cec5SDimitry Andric   return [=](const LegalityQuery &Query) {
800b57cec5SDimitry Andric     const LLT Ty = Query.Types[TypeIdx];
810b57cec5SDimitry Andric     unsigned NewEltSizeInBits =
820b57cec5SDimitry Andric         std::max(1u << Log2_32_Ceil(Ty.getScalarSizeInBits()), Min);
830b57cec5SDimitry Andric     return std::make_pair(TypeIdx, Ty.changeElementSize(NewEltSizeInBits));
840b57cec5SDimitry Andric   };
850b57cec5SDimitry Andric }
860b57cec5SDimitry Andric 
87349cc55cSDimitry Andric LegalizeMutation
widenScalarOrEltToNextMultipleOf(unsigned TypeIdx,unsigned Size)88349cc55cSDimitry Andric LegalizeMutations::widenScalarOrEltToNextMultipleOf(unsigned TypeIdx,
89349cc55cSDimitry Andric                                                     unsigned Size) {
90349cc55cSDimitry Andric   return [=](const LegalityQuery &Query) {
91349cc55cSDimitry Andric     const LLT Ty = Query.Types[TypeIdx];
92349cc55cSDimitry Andric     unsigned NewEltSizeInBits = alignTo(Ty.getScalarSizeInBits(), Size);
93349cc55cSDimitry Andric     return std::make_pair(TypeIdx, Ty.changeElementSize(NewEltSizeInBits));
94349cc55cSDimitry Andric   };
95349cc55cSDimitry Andric }
96349cc55cSDimitry Andric 
moreElementsToNextPow2(unsigned TypeIdx,unsigned Min)970b57cec5SDimitry Andric LegalizeMutation LegalizeMutations::moreElementsToNextPow2(unsigned TypeIdx,
980b57cec5SDimitry Andric                                                            unsigned Min) {
990b57cec5SDimitry Andric   return [=](const LegalityQuery &Query) {
1000b57cec5SDimitry Andric     const LLT VecTy = Query.Types[TypeIdx];
1010b57cec5SDimitry Andric     unsigned NewNumElements =
1020b57cec5SDimitry Andric         std::max(1u << Log2_32_Ceil(VecTy.getNumElements()), Min);
103fe6060f1SDimitry Andric     return std::make_pair(
104fe6060f1SDimitry Andric         TypeIdx, LLT::fixed_vector(NewNumElements, VecTy.getElementType()));
1050b57cec5SDimitry Andric   };
1060b57cec5SDimitry Andric }
1070b57cec5SDimitry Andric 
scalarize(unsigned TypeIdx)1080b57cec5SDimitry Andric LegalizeMutation LegalizeMutations::scalarize(unsigned TypeIdx) {
1090b57cec5SDimitry Andric   return [=](const LegalityQuery &Query) {
1100b57cec5SDimitry Andric     return std::make_pair(TypeIdx, Query.Types[TypeIdx].getElementType());
1110b57cec5SDimitry Andric   };
1120b57cec5SDimitry Andric }
113