diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 42ba89e41bd..fe9398f373c 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -2447,14 +2447,25 @@ TargetLowering::LowerArguments(Function &F, SelectionDAG &DAG) { } else { // Otherwise, this is a vector type. We only support legal vectors // right now. - unsigned NumElems = cast(I->getType())->getNumElements(); - const Type *EltTy = cast(I->getType())->getElementType(); + const PackedType *PTy = cast(I->getType()); + unsigned NumElems = PTy->getNumElements(); + const Type *EltTy = PTy->getElementType(); // Figure out if there is a Packed type corresponding to this Vector // type. If so, convert to the packed type. MVT::ValueType TVT = MVT::getVectorType(getValueType(EltTy), NumElems); if (TVT != MVT::Other && isTypeLegal(TVT)) { - Ops.push_back(SDOperand(Result, i++)); + SDOperand N = SDOperand(Result, i++); + // Handle copies from generic vectors to registers. + MVT::ValueType PTyElementVT, PTyLegalElementVT; + unsigned NE = getPackedTypeBreakdown(PTy, PTyElementVT, + PTyLegalElementVT); + // Insert a VBIT_CONVERT of the FORMAL_ARGUMENTS to a + // "N x PTyElementVT" MVT::Vector type. + N = DAG.getNode(ISD::VBIT_CONVERT, MVT::Vector, N, + DAG.getConstant(NE, MVT::i32), + DAG.getValueType(PTyElementVT)); + Ops.push_back(N); } else { assert(0 && "Don't support illegal by-val vector arguments yet!"); } @@ -2996,19 +3007,6 @@ LowerArguments(BasicBlock *BB, SelectionDAGLowering &SDL, if (!AI->use_empty()) { SDL.setValue(AI, Args[a]); - MVT::ValueType VT = TLI.getValueType(AI->getType()); - if (VT == MVT::Vector) { - // Insert a VBIT_CONVERT between the FORMAL_ARGUMENT node and its uses. - // Or else legalizer will balk. - BasicBlock::iterator InsertPt = BB->begin(); - Value *NewVal = new CastInst(AI, AI->getType(), AI->getName(), InsertPt); - for (Value::use_iterator UI = AI->use_begin(), E = AI->use_end(); - UI != E; ++UI) { - Instruction *User = cast(*UI); - if (User != NewVal) - User->replaceUsesOfWith(AI, NewVal); - } - } // If this argument is live outside of the entry block, insert a copy from // whereever we got it to the vreg that other BB's will reference it as. if (FuncInfo.ValueMap.count(AI)) { diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 139fc95b672..b0dd6a6cee9 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -453,7 +453,7 @@ static std::vector getFormalArgObjects(SDOperand Op) { assert(Op.getOpcode() == ISD::AssertSext || Op.getOpcode() == ISD::AssertZext); Objs.push_back(Op.getOperand(0)); - } else if (Opc == ISD::FP_ROUND) { + } else if (Opc == ISD::FP_ROUND || Opc == ISD::VBIT_CONVERT) { Objs.push_back(Op.getOperand(0)); } else if (Opc == ISD::BUILD_PAIR) { Objs.push_back(Op.getOperand(0));