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