diff options
author | Mon P Wang <wangmp@apple.com> | 2009-03-17 06:33:10 +0000 |
---|---|---|
committer | Mon P Wang <wangmp@apple.com> | 2009-03-17 06:33:10 +0000 |
commit | 93b7415f4cc9a83126f1d89b2d2f51a204b09dd6 (patch) | |
tree | 9bc0c6a8ca568a2e02e546727f985548fdd5fac7 /lib/CodeGen/SelectionDAG/DAGCombiner.cpp | |
parent | 9626447e70a3c8dc88b09f84414ee416a39518b1 (diff) |
Fix a problem with DAGCombine where we were building an illegal build
vector shuffle mask. Forced the mask to be built using i32. Note: this will
be irrelevant once vector_shuffle no longer takes a build vector for the
shuffle mask.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@67076 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SelectionDAG/DAGCombiner.cpp')
-rw-r--r-- | lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 3e517cfe3a..db4b392723 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -5164,30 +5164,35 @@ SDValue DAGCombiner::visitBUILD_VECTOR(SDNode *N) { } // If everything is good, we can make a shuffle operation. + MVT IndexVT = MVT::i32; if (VecIn1.getNode()) { SmallVector<SDValue, 8> BuildVecIndices; for (unsigned i = 0; i != NumInScalars; ++i) { if (N->getOperand(i).getOpcode() == ISD::UNDEF) { - BuildVecIndices.push_back(DAG.getUNDEF(TLI.getPointerTy())); + BuildVecIndices.push_back(DAG.getUNDEF(IndexVT)); continue; } SDValue Extract = N->getOperand(i); // If extracting from the first vector, just use the index directly. + SDValue ExtVal = Extract.getOperand(1); if (Extract.getOperand(0) == VecIn1) { - BuildVecIndices.push_back(Extract.getOperand(1)); + if (ExtVal.getValueType() == IndexVT) + BuildVecIndices.push_back(ExtVal); + else { + unsigned Idx = cast<ConstantSDNode>(ExtVal)->getZExtValue(); + BuildVecIndices.push_back(DAG.getConstant(Idx, IndexVT)); + } continue; } // Otherwise, use InIdx + VecSize - unsigned Idx = - cast<ConstantSDNode>(Extract.getOperand(1))->getZExtValue(); - BuildVecIndices.push_back(DAG.getIntPtrConstant(Idx+NumInScalars)); + unsigned Idx = cast<ConstantSDNode>(ExtVal)->getZExtValue(); + BuildVecIndices.push_back(DAG.getConstant(Idx+NumInScalars, IndexVT)); } // Add count and size info. - MVT IndexVT = MVT::getIntegerVT(EltType.getSizeInBits()); MVT BuildVecVT = MVT::getVectorVT(IndexVT, NumElts); if (!TLI.isTypeLegal(BuildVecVT) && LegalTypes) return SDValue(); |