diff options
author | Eric Christopher <echristo@apple.com> | 2010-11-03 09:36:40 +0000 |
---|---|---|
committer | Eric Christopher <echristo@apple.com> | 2010-11-03 09:36:40 +0000 |
commit | caebdd44f3a2c89457f09d0fa45a998c912235d2 (patch) | |
tree | 95ef70f34f025369f53e76c8ca2533713557fe5f /lib/CodeGen/SelectionDAG/DAGCombiner.cpp | |
parent | e3f75a3979072186a468951a82dfbba6436a0cd2 (diff) | |
download | external_llvm-caebdd44f3a2c89457f09d0fa45a998c912235d2.zip external_llvm-caebdd44f3a2c89457f09d0fa45a998c912235d2.tar.gz external_llvm-caebdd44f3a2c89457f09d0fa45a998c912235d2.tar.bz2 |
If we have an undef mask our Elt will be -1 for our access, handle
this by using an undef as a pointer.
Fixes rdar://8625016
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@118164 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SelectionDAG/DAGCombiner.cpp')
-rw-r--r-- | lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 10aa36c..c31598e 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -6190,7 +6190,7 @@ SDValue DAGCombiner::visitEXTRACT_VECTOR_ELT(SDNode *N) { SDValue EltNo = N->getOperand(1); if (isa<ConstantSDNode>(EltNo)) { - unsigned Elt = cast<ConstantSDNode>(EltNo)->getZExtValue(); + int Elt = cast<ConstantSDNode>(EltNo)->getZExtValue(); bool NewLoad = false; bool BCNumEltsChanged = false; EVT VT = InVec.getValueType(); @@ -6228,7 +6228,7 @@ SDValue DAGCombiner::visitEXTRACT_VECTOR_ELT(SDNode *N) { // Select the input vector, guarding against out of range extract vector. unsigned NumElems = VT.getVectorNumElements(); - int Idx = (Elt > NumElems) ? -1 : SVN->getMaskElt(Elt); + int Idx = (Elt > (int)NumElems) ? -1 : SVN->getMaskElt(Elt); InVec = (Idx < (int)NumElems) ? InVec.getOperand(0) : InVec.getOperand(1); if (InVec.getOpcode() == ISD::BIT_CONVERT) @@ -6257,7 +6257,11 @@ SDValue DAGCombiner::visitEXTRACT_VECTOR_ELT(SDNode *N) { SDValue NewPtr = LN0->getBasePtr(); unsigned PtrOff = 0; - if (Elt) { + // If Idx was -1 above, Elt is going to be -1, so just use undef as our + // new pointer. + if (Elt == -1) { + NewPtr = DAG.getUNDEF(NewPtr.getValueType()); + } else if (Elt) { PtrOff = LVT.getSizeInBits() * Elt / 8; EVT PtrType = NewPtr.getValueType(); if (TLI.isBigEndian()) |