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