An INSERT_VECTOR_ELT can insert a larger value
authorDuncan Sands <baldrick@free.fr>
Mon, 14 Jul 2008 17:32:02 +0000 (17:32 +0000)
committerDuncan Sands <baldrick@free.fr>
Mon, 14 Jul 2008 17:32:02 +0000 (17:32 +0000)
than the vector element type.  Don't forget to
handle this when the insertion index is not a
constant.

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

lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp

index 71fa7925c0245d1f1e853a575620edc2479fe1a2..ea1c0a8c13ea0216ce4869e45b0376c0614a031b 100644 (file)
@@ -360,13 +360,14 @@ void DAGTypeLegalizer::SplitVecRes_INSERT_VECTOR_ELT(SDNode *N, SDOperand &Lo,
 
   // Spill the vector to the stack.
   MVT VecVT = Vec.getValueType();
+  MVT EltVT = VecVT.getVectorElementType();
   SDOperand StackPtr = DAG.CreateStackTemporary(VecVT);
   SDOperand Store = DAG.getStore(DAG.getEntryNode(), Vec, StackPtr, NULL, 0);
 
-  // Store the new element.
-  SDOperand EltPtr = GetVectorElementPointer(StackPtr,
-                                             VecVT.getVectorElementType(), Idx);
-  Store = DAG.getStore(Store, Elt, EltPtr, NULL, 0);
+  // Store the new element.  This may be larger than the vector element type,
+  // so use a truncating store.
+  SDOperand EltPtr = GetVectorElementPointer(StackPtr, EltVT, Idx);
+  Store = DAG.getTruncStore(Store, Elt, EltPtr, NULL, 0, EltVT);
 
   // Reload the vector from the stack.
   SDOperand Load = DAG.getLoad(VecVT, Store, StackPtr, NULL, 0);