xref: /freebsd/contrib/llvm-project/llvm/lib/CodeGen/GlobalISel/LegalizeMutations.cpp (revision fe6060f10f634930ff71b7c50291ddc610da2475)
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 
660b57cec5SDimitry Andric LegalizeMutation LegalizeMutations::moreElementsToNextPow2(unsigned TypeIdx,
670b57cec5SDimitry Andric                                                            unsigned Min) {
680b57cec5SDimitry Andric   return [=](const LegalityQuery &Query) {
690b57cec5SDimitry Andric     const LLT VecTy = Query.Types[TypeIdx];
700b57cec5SDimitry Andric     unsigned NewNumElements =
710b57cec5SDimitry Andric         std::max(1u << Log2_32_Ceil(VecTy.getNumElements()), Min);
72*fe6060f1SDimitry Andric     return std::make_pair(
73*fe6060f1SDimitry Andric         TypeIdx, LLT::fixed_vector(NewNumElements, VecTy.getElementType()));
740b57cec5SDimitry Andric   };
750b57cec5SDimitry Andric }
760b57cec5SDimitry Andric 
770b57cec5SDimitry Andric LegalizeMutation LegalizeMutations::scalarize(unsigned TypeIdx) {
780b57cec5SDimitry Andric   return [=](const LegalityQuery &Query) {
790b57cec5SDimitry Andric     return std::make_pair(TypeIdx, Query.Types[TypeIdx].getElementType());
800b57cec5SDimitry Andric   };
810b57cec5SDimitry Andric }
82