If we have an undef mask our Elt will be -1 for our access, handle
authorEric Christopher <echristo@apple.com>
Wed, 3 Nov 2010 09:36:40 +0000 (09:36 +0000)
committerEric Christopher <echristo@apple.com>
Wed, 3 Nov 2010 09:36:40 +0000 (09:36 +0000)
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

lib/CodeGen/SelectionDAG/DAGCombiner.cpp

index 10aa36cf1a35e1c0bed216a1bd4a5d119ef6d217..c31598e6a7adc976358b7de6328da88d0ecb9e64 100644 (file)
@@ -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())