diff options
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 8 | ||||
-rw-r--r-- | test/CodeGen/X86/insertelement-copytoregs.ll | 11 |
2 files changed, 16 insertions, 3 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index df40972196..90ed4545bd 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -718,6 +718,8 @@ static void getCopyToParts(SelectionDAG &DAG, SDOperand *Parts, unsigned NumParts, MVT::ValueType PartVT) { + TargetLowering &TLI = DAG.getTargetLoweringInfo(); + MVT::ValueType PtrVT = TLI.getPointerTy(); MVT::ValueType ValueVT = Val.getValueType(); if (!MVT::isVector(ValueVT) || NumParts == 1) { @@ -725,7 +727,7 @@ static void getCopyToParts(SelectionDAG &DAG, if (NumParts > 1) { for (unsigned i = 0; i != NumParts; ++i) Parts[i] = DAG.getNode(ISD::EXTRACT_ELEMENT, PartVT, Val, - DAG.getConstant(i, MVT::i32)); + DAG.getConstant(i, PtrVT)); if (!DAG.getTargetLoweringInfo().isLittleEndian()) std::reverse(Parts, Parts + NumParts); return; @@ -776,11 +778,11 @@ static void getCopyToParts(SelectionDAG &DAG, Ops[i] = DAG.getNode(ISD::EXTRACT_SUBVECTOR, IntermediateVT, Val, DAG.getConstant(i * (NumElements / NumIntermediates), - MVT::i32)); + PtrVT)); else Ops[i] = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, IntermediateVT, Val, - DAG.getConstant(i, MVT::i32)); + DAG.getConstant(i, PtrVT)); // Split the intermediate operands into legal parts. if (NumParts == NumIntermediates) { diff --git a/test/CodeGen/X86/insertelement-copytoregs.ll b/test/CodeGen/X86/insertelement-copytoregs.ll new file mode 100644 index 0000000000..0eef5173b8 --- /dev/null +++ b/test/CodeGen/X86/insertelement-copytoregs.ll @@ -0,0 +1,11 @@ +; RUN: llvm-as < %s | llc -march=x86-64 | grep -v IMPLICIT_DEF + +define void @foo(<2 x float>* %p) { + %t = insertelement <2 x float> undef, float 0.0, i32 0 + %v = insertelement <2 x float> %t, float 0.0, i32 1 + br label %bb8 + +bb8: + store <2 x float> %v, <2 x float>* %p + ret void +} |