INSERT_VECTOR_ELT lowering bug:
authorEvan Cheng <evan.cheng@apple.com>
Sat, 8 Apr 2006 01:46:37 +0000 (01:46 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Sat, 8 Apr 2006 01:46:37 +0000 (01:46 +0000)
  store vector to $esp
  store element to $esp + sizeof(VT) * index
  load  vector from $esp
The bug is VT is the type of the vector element, not the type of the vector!

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

lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

index b0d0b37aa6430e894ad6024d02d60ea7d60e7649..ed6cdb3417f4a6296b173d8cce22c806c916c2d2 100644 (file)
@@ -867,30 +867,27 @@ SDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
       // with a "move to register" or "extload into register" instruction, then
       // permute it into place, if the idx is a constant and if the idx is
       // supported by the target.
-      SDOperand StackPtr = CreateStackTemporary(Tmp1.getValueType());
+      MVT::ValueType VT    = Tmp1.getValueType();
+      MVT::ValueType EltVT = Tmp2.getValueType();
+      MVT::ValueType IdxVT = Tmp3.getValueType();
+      MVT::ValueType PtrVT = TLI.getPointerTy();
+      SDOperand StackPtr = CreateStackTemporary(VT);
       // Store the vector.
       SDOperand Ch = DAG.getNode(ISD::STORE, MVT::Other, DAG.getEntryNode(),
                                  Tmp1, StackPtr, DAG.getSrcValue(NULL));
 
       // Truncate or zero extend offset to target pointer type.
-      MVT::ValueType IntPtr = TLI.getPointerTy();
-      if (Tmp3.getValueType() > IntPtr)
-        Tmp3 = DAG.getNode(ISD::TRUNCATE, IntPtr, Tmp3);
-      else
-        Tmp3 = DAG.getNode(ISD::ZERO_EXTEND, IntPtr, Tmp3);
-
+      unsigned CastOpc = (IdxVT > PtrVT) ? ISD::TRUNCATE : ISD::ZERO_EXTEND;
+      Tmp3 = DAG.getNode(CastOpc, PtrVT, Tmp3);
       // Add the offset to the index.
-      unsigned EltSize = MVT::getSizeInBits(Result.getValueType())/8;
-      Tmp3 = DAG.getNode(ISD::MUL, Tmp3.getValueType(), Tmp3,
-                         DAG.getConstant(EltSize, Tmp3.getValueType()));
-      SDOperand StackPtr2 =
-        DAG.getNode(ISD::ADD, Tmp3.getValueType(), Tmp3, StackPtr);
+      unsigned EltSize = MVT::getSizeInBits(EltVT)/8;
+      Tmp3 = DAG.getNode(ISD::MUL, IdxVT, Tmp3,DAG.getConstant(EltSize, IdxVT));
+      SDOperand StackPtr2 = DAG.getNode(ISD::ADD, IdxVT, Tmp3, StackPtr);
       // Store the scalar value.
       Ch = DAG.getNode(ISD::STORE, MVT::Other, Ch,
                        Tmp2, StackPtr2, DAG.getSrcValue(NULL));
       // Load the updated vector.
-      Result = DAG.getLoad(Result.getValueType(), Ch, StackPtr,
-                           DAG.getSrcValue(NULL));
+      Result = DAG.getLoad(VT, Ch, StackPtr, DAG.getSrcValue(NULL));
       break;
     }
     }