summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp
diff options
context:
space:
mode:
authorTim Northover <tnorthover@apple.com>2016-08-23 19:30:42 +0000
committerTim Northover <tnorthover@apple.com>2016-08-23 19:30:42 +0000
commita01bece1dcbc95cb7e99421e050e27e231f6e995 (patch)
tree5b0ef12375f4e0239428c888fd4134938ee03076 /llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp
parent456a3c03aceab17fff31eddbae9f8478dc4e3025 (diff)
downloadbcm5719-llvm-a01bece1dcbc95cb7e99421e050e27e231f6e995.tar.gz
bcm5719-llvm-a01bece1dcbc95cb7e99421e050e27e231f6e995.zip
GlobalISel: extend legalizer interface to handle multiple types.
Instructions like G_ICMP have multiple types that may need to be legalized (the boolean output and nearly arbitrary inputs in this case). So the legalizer must be capable of deciding what to do for each of them separately. llvm-svn: 279554
Diffstat (limited to 'llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp')
-rw-r--r--llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp21
1 files changed, 14 insertions, 7 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp b/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp
index 7c3253dd36a..bd8374cb6b0 100644
--- a/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp
@@ -34,15 +34,15 @@ MachineLegalizeHelper::MachineLegalizeHelper(MachineFunction &MF)
MachineLegalizeHelper::LegalizeResult MachineLegalizeHelper::legalizeInstr(
MachineInstr &MI, const MachineLegalizer &Legalizer) {
auto Action = Legalizer.getAction(MI);
- switch (Action.first) {
+ switch (std::get<0>(Action)) {
case MachineLegalizer::Legal:
return AlreadyLegal;
case MachineLegalizer::NarrowScalar:
- return narrowScalar(MI, Action.second);
+ return narrowScalar(MI, std::get<1>(Action), std::get<2>(Action));
case MachineLegalizer::WidenScalar:
- return widenScalar(MI, Action.second);
+ return widenScalar(MI, std::get<1>(Action), std::get<2>(Action));
case MachineLegalizer::FewerElements:
- return fewerElementsVector(MI, Action.second);
+ return fewerElementsVector(MI, std::get<1>(Action), std::get<2>(Action));
default:
return UnableToLegalize;
}
@@ -63,7 +63,9 @@ void MachineLegalizeHelper::extractParts(unsigned Reg, LLT Ty, int NumParts,
}
MachineLegalizeHelper::LegalizeResult
-MachineLegalizeHelper::narrowScalar(MachineInstr &MI, LLT NarrowTy) {
+MachineLegalizeHelper::narrowScalar(MachineInstr &MI, unsigned TypeIdx,
+ LLT NarrowTy) {
+ assert(TypeIdx == 0 && "don't know how to handle secondary types yet");
switch (MI.getOpcode()) {
default:
return UnableToLegalize;
@@ -103,7 +105,10 @@ MachineLegalizeHelper::narrowScalar(MachineInstr &MI, LLT NarrowTy) {
}
MachineLegalizeHelper::LegalizeResult
-MachineLegalizeHelper::widenScalar(MachineInstr &MI, LLT WideTy) {
+MachineLegalizeHelper::widenScalar(MachineInstr &MI, unsigned TypeIdx,
+ LLT WideTy) {
+ assert(TypeIdx == 0 && "don't know how to handle secondary types yet");
+
unsigned WideSize = WideTy.getSizeInBits();
MIRBuilder.setInstr(MI);
@@ -172,7 +177,9 @@ MachineLegalizeHelper::widenScalar(MachineInstr &MI, LLT WideTy) {
}
MachineLegalizeHelper::LegalizeResult
-MachineLegalizeHelper::fewerElementsVector(MachineInstr &MI, LLT NarrowTy) {
+MachineLegalizeHelper::fewerElementsVector(MachineInstr &MI, unsigned TypeIdx,
+ LLT NarrowTy) {
+ assert(TypeIdx == 0 && "don't know how to handle secondary types yet");
switch (MI.getOpcode()) {
default:
return UnableToLegalize;
OpenPOWER on IntegriCloud