Fix EXTRACT_ELEMENT, EXTRACT_SUBVECTOR, and EXTRACT_VECTOR_ELT to
authorDan Gohman <gohman@apple.com>
Fri, 10 Aug 2007 14:59:38 +0000 (14:59 +0000)
committerDan Gohman <gohman@apple.com>
Fri, 10 Aug 2007 14:59:38 +0000 (14:59 +0000)
use an intptr ValueType instead of i32 for the index operand in
getCopyToParts.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@40987 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
test/CodeGen/X86/insertelement-copytoregs.ll [new file with mode: 0644]

index df40972196be9c17539c077056f07b7be0f1f7b7..90ed4545bd0187140c779cfc6bff5865d07d46d0 100644 (file)
@@ -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 (file)
index 0000000..0eef517
--- /dev/null
@@ -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
+}