Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 1 | //===- lib/CodeGen/GlobalISel/LegalizerMutations.cpp - Mutations ----------===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | // |
| 10 | // A library of mutation factories to use for LegalityMutation. |
| 11 | // |
| 12 | //===----------------------------------------------------------------------===// |
| 13 | |
| 14 | #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h" |
| 15 | |
| 16 | using namespace llvm; |
| 17 | |
Daniel Sanders | 1cc5756 | 2018-01-29 20:46:16 +0000 | [diff] [blame] | 18 | LegalizeMutation LegalizeMutations::changeTo(unsigned TypeIdx, LLT Ty) { |
Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 19 | return |
| 20 | [=](const LegalityQuery &Query) { return std::make_pair(TypeIdx, Ty); }; |
| 21 | } |
| 22 | |
Daniel Sanders | 5281b02 | 2018-04-09 21:10:09 +0000 | [diff] [blame] | 23 | LegalizeMutation LegalizeMutations::changeTo(unsigned TypeIdx, |
| 24 | unsigned FromTypeIdx) { |
| 25 | return [=](const LegalityQuery &Query) { |
| 26 | return std::make_pair(TypeIdx, Query.Types[FromTypeIdx]); |
| 27 | }; |
| 28 | } |
| 29 | |
Daniel Sanders | 79cb839 | 2018-01-29 19:54:49 +0000 | [diff] [blame] | 30 | LegalizeMutation LegalizeMutations::widenScalarToNextPow2(unsigned TypeIdx, |
| 31 | unsigned Min) { |
| 32 | return [=](const LegalityQuery &Query) { |
| 33 | unsigned NewSizeInBits = |
| 34 | 1 << Log2_32_Ceil(Query.Types[TypeIdx].getSizeInBits()); |
| 35 | if (NewSizeInBits < Min) |
| 36 | NewSizeInBits = Min; |
| 37 | return std::make_pair(TypeIdx, LLT::scalar(NewSizeInBits)); |
| 38 | }; |
| 39 | } |
| 40 | |
| 41 | LegalizeMutation LegalizeMutations::moreElementsToNextPow2(unsigned TypeIdx, |
| 42 | unsigned Min) { |
| 43 | return [=](const LegalityQuery &Query) { |
| 44 | const LLT &VecTy = Query.Types[TypeIdx]; |
| 45 | unsigned NewNumElements = 1 << Log2_32_Ceil(VecTy.getNumElements()); |
| 46 | if (NewNumElements < Min) |
| 47 | NewNumElements = Min; |
| 48 | return std::make_pair( |
| 49 | TypeIdx, LLT::vector(NewNumElements, VecTy.getScalarSizeInBits())); |
| 50 | }; |
| 51 | } |