diff options
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp | 21 | ||||
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/MachineLegalizer.cpp | 54 |
2 files changed, 45 insertions, 30 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; diff --git a/llvm/lib/CodeGen/GlobalISel/MachineLegalizer.cpp b/llvm/lib/CodeGen/GlobalISel/MachineLegalizer.cpp index fa23627de7c..dd32b1fe10f 100644 --- a/llvm/lib/CodeGen/GlobalISel/MachineLegalizer.cpp +++ b/llvm/lib/CodeGen/GlobalISel/MachineLegalizer.cpp @@ -35,12 +35,12 @@ MachineLegalizer::MachineLegalizer() : TablesInitialized(false) { void MachineLegalizer::computeTables() { for (auto &Op : Actions) { - LLT Ty = Op.first.second; + LLT Ty = Op.first.Type; if (!Ty.isVector()) continue; - auto &Entry = - MaxLegalVectorElts[std::make_pair(Op.first.first, Ty.getElementType())]; + auto &Entry = MaxLegalVectorElts[std::make_pair(Op.first.Opcode, + Ty.getElementType())]; Entry = std::max(Entry, Ty.getNumElements()); } @@ -52,27 +52,30 @@ void MachineLegalizer::computeTables() { // we have any hope of doing well with something like <13 x i3>. Even the common // cases should do better than what we have now. std::pair<MachineLegalizer::LegalizeAction, LLT> -MachineLegalizer::getAction(unsigned Opcode, LLT Ty) const { +MachineLegalizer::getAction(const InstrAspect &Aspect) const { assert(TablesInitialized && "backend forgot to call computeTables"); // These *have* to be implemented for now, they're the fundamental basis of // how everything else is transformed. // FIXME: the long-term plan calls for expansion in terms of load/store (if // they're not legal). - if (Opcode == TargetOpcode::G_SEQUENCE || Opcode == TargetOpcode::G_EXTRACT) - return std::make_pair(Legal, Ty); + if (Aspect.Opcode == TargetOpcode::G_SEQUENCE || + Aspect.Opcode == TargetOpcode::G_EXTRACT) + return std::make_pair(Legal, Aspect.Type); - auto ActionIt = Actions.find(std::make_pair(Opcode, Ty)); + auto ActionIt = Actions.find(Aspect); if (ActionIt != Actions.end()) - return findLegalAction(Opcode, Ty, ActionIt->second); + return findLegalAction(Aspect, ActionIt->second); + unsigned Opcode = Aspect.Opcode; + LLT Ty = Aspect.Type; if (!Ty.isVector()) { - auto DefaultAction = DefaultActions.find(Opcode); + auto DefaultAction = DefaultActions.find(Aspect.Opcode); if (DefaultAction != DefaultActions.end() && DefaultAction->second == Legal) return std::make_pair(Legal, Ty); assert(DefaultAction->second == NarrowScalar && "unexpected default"); - return findLegalAction(Opcode, Ty, NarrowScalar); + return findLegalAction(Aspect, NarrowScalar); } LLT EltTy = Ty.getElementType(); @@ -81,13 +84,13 @@ MachineLegalizer::getAction(unsigned Opcode, LLT Ty) const { auto ScalarAction = ScalarInVectorActions.find(std::make_pair(Opcode, EltTy)); if (ScalarAction != ScalarInVectorActions.end() && ScalarAction->second != Legal) - return findLegalAction(Opcode, EltTy, ScalarAction->second); + return findLegalAction(Aspect, ScalarAction->second); // The element type is legal in principle, but the number of elements is // wrong. auto MaxLegalElts = MaxLegalVectorElts.lookup(std::make_pair(Opcode, EltTy)); if (MaxLegalElts > NumElts) - return findLegalAction(Opcode, Ty, MoreElements); + return findLegalAction(Aspect, MoreElements); if (MaxLegalElts == 0) { // Scalarize if there's no legal vector type, which is just a special case @@ -95,41 +98,46 @@ MachineLegalizer::getAction(unsigned Opcode, LLT Ty) const { return std::make_pair(FewerElements, EltTy); } - return findLegalAction(Opcode, Ty, FewerElements); + return findLegalAction(Aspect, FewerElements); } -std::pair<MachineLegalizer::LegalizeAction, LLT> +std::tuple<MachineLegalizer::LegalizeAction, unsigned, LLT> MachineLegalizer::getAction(const MachineInstr &MI) const { - return getAction(MI.getOpcode(), MI.getType()); + for (unsigned i = 0; i < MI.getNumTypes(); ++i) { + auto Action = getAction({MI.getOpcode(), i, MI.getType(i)}); + if (Action.first != Legal) + return {Action.first, i, Action.second}; + } + return {Legal, 0, LLT{}}; } bool MachineLegalizer::isLegal(const MachineInstr &MI) const { - return getAction(MI).first == Legal; + return std::get<0>(getAction(MI)) == Legal; } -LLT MachineLegalizer::findLegalType(unsigned Opcode, LLT Ty, +LLT MachineLegalizer::findLegalType(const InstrAspect &Aspect, LegalizeAction Action) const { switch(Action) { default: llvm_unreachable("Cannot find legal type"); case Legal: - return Ty; + return Aspect.Type; case NarrowScalar: { - return findLegalType(Opcode, Ty, + return findLegalType(Aspect, [&](LLT Ty) -> LLT { return Ty.halfScalarSize(); }); } case WidenScalar: { - return findLegalType(Opcode, Ty, [&](LLT Ty) -> LLT { + return findLegalType(Aspect, [&](LLT Ty) -> LLT { return Ty.getSizeInBits() < 8 ? LLT::scalar(8) : Ty.doubleScalarSize(); }); } case FewerElements: { - return findLegalType(Opcode, Ty, + return findLegalType(Aspect, [&](LLT Ty) -> LLT { return Ty.halfElements(); }); } case MoreElements: { - return findLegalType( - Opcode, Ty, [&](LLT Ty) -> LLT { return Ty.doubleElements(); }); + return findLegalType(Aspect, + [&](LLT Ty) -> LLT { return Ty.doubleElements(); }); } } } |