llvm/lib/CodeGen/GlobalISel/LegalizeMutations.cpp
Daniel Sanders 0b943e2bc4 [globalisel][legalizerinfo] Add support for the Lower action in getActionDefinitionsBuilder() and use it in AArch64.
Lower is slightly odd. It often doesn't change the type but the lowerings
do use the new type to decide what code to create. Treat it like a mutation
but provide convenience functions that re-use the existing type.

Re-uses the existing tests:
test/CodeGen/AArch64/GlobalISel/legalize-rem.mir
test/CodeGen/AArch64/GlobalISel//legalize-mul.mir
test/CodeGen/AArch64/GlobalISel//legalize-cmpxchg-with-success.mir


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@329623 91177308-0d34-0410-b5e6-96231b3b80d8
2018-04-09 21:10:09 +00:00

52 lines
1.8 KiB
C++

//===- lib/CodeGen/GlobalISel/LegalizerMutations.cpp - Mutations ----------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// A library of mutation factories to use for LegalityMutation.
//
//===----------------------------------------------------------------------===//
#include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
using namespace llvm;
LegalizeMutation LegalizeMutations::changeTo(unsigned TypeIdx, LLT Ty) {
return
[=](const LegalityQuery &Query) { return std::make_pair(TypeIdx, Ty); };
}
LegalizeMutation LegalizeMutations::changeTo(unsigned TypeIdx,
unsigned FromTypeIdx) {
return [=](const LegalityQuery &Query) {
return std::make_pair(TypeIdx, Query.Types[FromTypeIdx]);
};
}
LegalizeMutation LegalizeMutations::widenScalarToNextPow2(unsigned TypeIdx,
unsigned Min) {
return [=](const LegalityQuery &Query) {
unsigned NewSizeInBits =
1 << Log2_32_Ceil(Query.Types[TypeIdx].getSizeInBits());
if (NewSizeInBits < Min)
NewSizeInBits = Min;
return std::make_pair(TypeIdx, LLT::scalar(NewSizeInBits));
};
}
LegalizeMutation LegalizeMutations::moreElementsToNextPow2(unsigned TypeIdx,
unsigned Min) {
return [=](const LegalityQuery &Query) {
const LLT &VecTy = Query.Types[TypeIdx];
unsigned NewNumElements = 1 << Log2_32_Ceil(VecTy.getNumElements());
if (NewNumElements < Min)
NewNumElements = Min;
return std::make_pair(
TypeIdx, LLT::vector(NewNumElements, VecTy.getScalarSizeInBits()));
};
}