diff options
author | Tim Northover <tnorthover@apple.com> | 2016-08-23 19:30:42 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2016-08-23 19:30:42 +0000 |
commit | a01bece1dcbc95cb7e99421e050e27e231f6e995 (patch) | |
tree | 5b0ef12375f4e0239428c888fd4134938ee03076 /llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp | |
parent | 456a3c03aceab17fff31eddbae9f8478dc4e3025 (diff) | |
download | bcm5719-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.cpp | 21 |
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; |