Index: llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp =================================================================== --- llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp +++ llvm/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp @@ -258,9 +258,15 @@ assert(Lowered->getNumValues() == Op->getNumValues() && "Unexpected number of results"); if (Lowered != SDValue(Node, 0)) { - // Make sure the new code is also legal. - Lowered = LegalizeOp(Lowered); Changed = true; + + // Make sure the new code is also legal. + for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i) + AddLegalizedOperand(Op.getValue(i), + LegalizeOp(Lowered.getValue(i))); + + // Map was updated above, return corresponding result. + return LegalizedNodes[Op]; } return TranslateLegalizeResults(Op, Lowered.getNode()); } @@ -464,6 +470,12 @@ Action = TLI.getOperationAction(Node->getOpcode(), Node->getOperand(0).getValueType()); break; + case ISD::MERGE_VALUES: + Action = TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0)); + // This operation lies about being legal: when they claim to be legal, + // they should actually be expanded. + if (Action == TargetLowering::Legal) + Action = TargetLowering::Expand; } LLVM_DEBUG(dbgs() << "\nLegalizing vector op: "; Node->dump(&DAG)); @@ -483,22 +495,28 @@ if (SDValue Tmp = TLI.LowerOperation(SDValue(Node, 0), DAG)) { LLVM_DEBUG(dbgs() << "Successfully custom legalized node\n"); if (Tmp != SDValue(Node, 0)) { - // Make sure that the generated code is itself legal. - Tmp = LegalizeOp(Tmp); Changed = true; - } - // Tmp might point to a single result from a multi result node, in that - // case we need to use it's result number. - if (Node->getNumValues() == 1) { - AddLegalizedOperand(Op, Tmp); - return Tmp; + // Tmp might point to a single result from a multi result node, in that + // case we need to use it's result number. + if (Node->getNumValues() == 1) { + Tmp = LegalizeOp(Tmp); + AddLegalizedOperand(Op, Tmp); + return Tmp; + } + + // Otherwise it should be a multi-result node with the same number of + // results. + assert(Tmp->getNumValues() == Node->getNumValues() && + "Unexpected number of results"); + + for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i) + AddLegalizedOperand(Op.getValue(i), LegalizeOp(Tmp.getValue(i))); + + // Map was updated above, return corresponding result. + return LegalizedNodes[Op]; } - // Otherwise it should be a multi-result node with the same number of - // results. - assert(Tmp->getNumValues() == Node->getNumValues() && - "Unexpected number of results"); return TranslateLegalizeResults(Op, Tmp.getNode()); } LLVM_DEBUG(dbgs() << "Could not custom legalize node\n"); @@ -821,6 +839,10 @@ SmallVector Results; switch (Op->getOpcode()) { + case ISD::MERGE_VALUES: + for (unsigned i = 0; i != Node->getNumValues(); ++i) + Results.push_back(Node->getOperand(i)); + break; case ISD::SIGN_EXTEND_INREG: Results.push_back(ExpandSEXTINREG(Op)); break;