brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.3 KiB · ded4df4 Raw
111 lines · cpp
1//===- lib/CodeGen/GlobalISel/LegalizerMutations.cpp - Mutations ----------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// A library of mutation factories to use for LegalityMutation.10//11//===----------------------------------------------------------------------===//12 13#include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"14 15using namespace llvm;16 17LegalizeMutation LegalizeMutations::changeTo(unsigned TypeIdx, LLT Ty) {18  return19      [=](const LegalityQuery &Query) { return std::make_pair(TypeIdx, Ty); };20}21 22LegalizeMutation LegalizeMutations::changeTo(unsigned TypeIdx,23                                             unsigned FromTypeIdx) {24  return [=](const LegalityQuery &Query) {25    return std::make_pair(TypeIdx, Query.Types[FromTypeIdx]);26  };27}28 29LegalizeMutation LegalizeMutations::changeElementTo(unsigned TypeIdx,30                                                    unsigned FromTypeIdx) {31  return [=](const LegalityQuery &Query) {32    const LLT OldTy = Query.Types[TypeIdx];33    const LLT NewTy = Query.Types[FromTypeIdx];34    return std::make_pair(TypeIdx, OldTy.changeElementType(NewTy));35  };36}37 38LegalizeMutation LegalizeMutations::changeElementTo(unsigned TypeIdx,39                                                    LLT NewEltTy) {40  return [=](const LegalityQuery &Query) {41    const LLT OldTy = Query.Types[TypeIdx];42    return std::make_pair(TypeIdx, OldTy.changeElementType(NewEltTy));43  };44}45 46LegalizeMutation LegalizeMutations::changeElementCountTo(unsigned TypeIdx,47                                                         unsigned FromTypeIdx) {48  return [=](const LegalityQuery &Query) {49    const LLT OldTy = Query.Types[TypeIdx];50    const LLT NewTy = Query.Types[FromTypeIdx];51    ElementCount NewEltCount =52        NewTy.isVector() ? NewTy.getElementCount() : ElementCount::getFixed(1);53    return std::make_pair(TypeIdx, OldTy.changeElementCount(NewEltCount));54  };55}56 57LegalizeMutation LegalizeMutations::changeElementCountTo(unsigned TypeIdx,58                                                         ElementCount EC) {59  return [=](const LegalityQuery &Query) {60    const LLT OldTy = Query.Types[TypeIdx];61    return std::make_pair(TypeIdx, OldTy.changeElementCount(EC));62  };63}64 65LegalizeMutation LegalizeMutations::changeElementSizeTo(unsigned TypeIdx,66                                                        unsigned FromTypeIdx) {67  return [=](const LegalityQuery &Query) {68    const LLT OldTy = Query.Types[TypeIdx];69    const LLT NewTy = Query.Types[FromTypeIdx];70    const LLT NewEltTy = LLT::scalar(NewTy.getScalarSizeInBits());71    return std::make_pair(TypeIdx, OldTy.changeElementType(NewEltTy));72  };73}74 75LegalizeMutation LegalizeMutations::widenScalarOrEltToNextPow2(unsigned TypeIdx,76                                                               unsigned Min) {77  return [=](const LegalityQuery &Query) {78    const LLT Ty = Query.Types[TypeIdx];79    unsigned NewEltSizeInBits =80        std::max(1u << Log2_32_Ceil(Ty.getScalarSizeInBits()), Min);81    return std::make_pair(TypeIdx, Ty.changeElementSize(NewEltSizeInBits));82  };83}84 85LegalizeMutation86LegalizeMutations::widenScalarOrEltToNextMultipleOf(unsigned TypeIdx,87                                                    unsigned Size) {88  return [=](const LegalityQuery &Query) {89    const LLT Ty = Query.Types[TypeIdx];90    unsigned NewEltSizeInBits = alignTo(Ty.getScalarSizeInBits(), Size);91    return std::make_pair(TypeIdx, Ty.changeElementSize(NewEltSizeInBits));92  };93}94 95LegalizeMutation LegalizeMutations::moreElementsToNextPow2(unsigned TypeIdx,96                                                           unsigned Min) {97  return [=](const LegalityQuery &Query) {98    const LLT VecTy = Query.Types[TypeIdx];99    unsigned NewNumElements =100        std::max(1u << Log2_32_Ceil(VecTy.getNumElements()), Min);101    return std::make_pair(102        TypeIdx, LLT::fixed_vector(NewNumElements, VecTy.getElementType()));103  };104}105 106LegalizeMutation LegalizeMutations::scalarize(unsigned TypeIdx) {107  return [=](const LegalityQuery &Query) {108    return std::make_pair(TypeIdx, Query.Types[TypeIdx].getElementType());109  };110}111