xref: /freebsd/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/LegalizeMutations.cpp (revision 349cc55c9796c4596a5b9904cd3281af295f878f)
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 
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 
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 
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 
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 
46e8d8bef9SDimitry Andric LegalizeMutation LegalizeMutations::changeElementSizeTo(unsigned TypeIdx,
47e8d8bef9SDimitry Andric                                                         unsigned FromTypeIdx) {
48e8d8bef9SDimitry Andric   return [=](const LegalityQuery &Query) {
49e8d8bef9SDimitry Andric     const LLT OldTy = Query.Types[TypeIdx];
50e8d8bef9SDimitry Andric     const LLT NewTy = Query.Types[FromTypeIdx];
51e8d8bef9SDimitry Andric     const LLT NewEltTy = LLT::scalar(NewTy.getScalarSizeInBits());
52e8d8bef9SDimitry Andric     return std::make_pair(TypeIdx, OldTy.changeElementType(NewEltTy));
53e8d8bef9SDimitry Andric   };
54e8d8bef9SDimitry Andric }
55e8d8bef9SDimitry Andric 
560b57cec5SDimitry Andric LegalizeMutation LegalizeMutations::widenScalarOrEltToNextPow2(unsigned TypeIdx,
570b57cec5SDimitry Andric                                                                unsigned Min) {
580b57cec5SDimitry Andric   return [=](const LegalityQuery &Query) {
590b57cec5SDimitry Andric     const LLT Ty = Query.Types[TypeIdx];
600b57cec5SDimitry Andric     unsigned NewEltSizeInBits =
610b57cec5SDimitry Andric         std::max(1u << Log2_32_Ceil(Ty.getScalarSizeInBits()), Min);
620b57cec5SDimitry Andric     return std::make_pair(TypeIdx, Ty.changeElementSize(NewEltSizeInBits));
630b57cec5SDimitry Andric   };
640b57cec5SDimitry Andric }
650b57cec5SDimitry Andric 
66*349cc55cSDimitry Andric LegalizeMutation
67*349cc55cSDimitry Andric LegalizeMutations::widenScalarOrEltToNextMultipleOf(unsigned TypeIdx,
68*349cc55cSDimitry Andric                                                     unsigned Size) {
69*349cc55cSDimitry Andric   return [=](const LegalityQuery &Query) {
70*349cc55cSDimitry Andric     const LLT Ty = Query.Types[TypeIdx];
71*349cc55cSDimitry Andric     unsigned NewEltSizeInBits = alignTo(Ty.getScalarSizeInBits(), Size);
72*349cc55cSDimitry Andric     return std::make_pair(TypeIdx, Ty.changeElementSize(NewEltSizeInBits));
73*349cc55cSDimitry Andric   };
74*349cc55cSDimitry Andric }
75*349cc55cSDimitry Andric 
760b57cec5SDimitry Andric LegalizeMutation LegalizeMutations::moreElementsToNextPow2(unsigned TypeIdx,
770b57cec5SDimitry Andric                                                            unsigned Min) {
780b57cec5SDimitry Andric   return [=](const LegalityQuery &Query) {
790b57cec5SDimitry Andric     const LLT VecTy = Query.Types[TypeIdx];
800b57cec5SDimitry Andric     unsigned NewNumElements =
810b57cec5SDimitry Andric         std::max(1u << Log2_32_Ceil(VecTy.getNumElements()), Min);
82fe6060f1SDimitry Andric     return std::make_pair(
83fe6060f1SDimitry Andric         TypeIdx, LLT::fixed_vector(NewNumElements, VecTy.getElementType()));
840b57cec5SDimitry Andric   };
850b57cec5SDimitry Andric }
860b57cec5SDimitry Andric 
870b57cec5SDimitry Andric LegalizeMutation LegalizeMutations::scalarize(unsigned TypeIdx) {
880b57cec5SDimitry Andric   return [=](const LegalityQuery &Query) {
890b57cec5SDimitry Andric     return std::make_pair(TypeIdx, Query.Types[TypeIdx].getElementType());
900b57cec5SDimitry Andric   };
910b57cec5SDimitry Andric }
92