aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDuncan Sands <baldrick@free.fr>2008-07-14 17:32:02 +0000
committerDuncan Sands <baldrick@free.fr>2008-07-14 17:32:02 +0000
commit262e04b3078e38c8dc5cdc40bf51e7cd467fd57a (patch)
tree919eae29931cc3ef6d86d1c7aed1dd79c8d804b4
parent8cc364c5cc210c56808011a5ebad28a719f106b7 (diff)
An INSERT_VECTOR_ELT can insert a larger value
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
-rw-r--r--lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp9
1 files changed, 5 insertions, 4 deletions
diff --git a/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
index 71fa7925c0..ea1c0a8c13 100644
--- a/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
+++ b/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
@@ -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);