From fbf19ef1860e33b202ff73a269b8b0bf9157460e Mon Sep 17 00:00:00 2001 From: Nadav Rotem Date: Tue, 18 Oct 2011 22:32:43 +0000 Subject: Fix a bug in the legalization of vector anyext-load and trunc-store. Mem Index starts with zero. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142434 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'lib/CodeGen') diff --git a/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp b/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp index efbd28c412..7fe35306bd 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeVectorOps.cpp @@ -298,6 +298,7 @@ SDValue VectorLegalizer::ExpandLoad(SDValue Op) { SDValue Chain = LD->getChain(); SDValue BasePTR = LD->getBasePtr(); EVT SrcVT = LD->getMemoryVT(); + ISD::LoadExtType ExtType = LD->getExtensionType(); SmallVector LoadVals; SmallVector LoadChains; @@ -305,19 +306,20 @@ SDValue VectorLegalizer::ExpandLoad(SDValue Op) { unsigned Stride = SrcVT.getScalarType().getSizeInBits()/8; for (unsigned Idx=0; IdxgetValueType(0).getScalarType(), Chain, BasePTR, LD->getPointerInfo().getWithOffset(Idx * Stride), SrcVT.getScalarType(), LD->isVolatile(), LD->isNonTemporal(), LD->getAlignment()); + BasePTR = DAG.getNode(ISD::ADD, dl, BasePTR.getValueType(), BasePTR, + DAG.getIntPtrConstant(Stride)); + LoadVals.push_back(ScalarLoad.getValue(0)); LoadChains.push_back(ScalarLoad.getValue(1)); } - + SDValue NewChain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, &LoadChains[0], LoadChains.size()); SDValue Value = DAG.getNode(ISD::BUILD_VECTOR, dl, @@ -364,14 +366,14 @@ SDValue VectorLegalizer::ExpandStore(SDValue Op) { SDValue Ex = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, RegSclVT, Value, DAG.getIntPtrConstant(Idx)); - BasePTR = DAG.getNode(ISD::ADD, dl, BasePTR.getValueType(), BasePTR, - DAG.getIntPtrConstant(Stride)); - // This scalar TruncStore may be illegal, but we legalize it later. SDValue Store = DAG.getTruncStore(Chain, dl, Ex, BasePTR, ST->getPointerInfo().getWithOffset(Idx*Stride), MemSclVT, isVolatile, isNonTemporal, Alignment); + BasePTR = DAG.getNode(ISD::ADD, dl, BasePTR.getValueType(), BasePTR, + DAG.getIntPtrConstant(Stride)); + Stores.push_back(Store); } SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, -- cgit v1.2.3