aboutsummaryrefslogtreecommitdiffstats
path: root/lib/CodeGen/SelectionDAG
diff options
context:
space:
mode:
authorMon P Wang <wangmp@apple.com>2009-03-17 06:33:10 +0000
committerMon P Wang <wangmp@apple.com>2009-03-17 06:33:10 +0000
commit93b7415f4cc9a83126f1d89b2d2f51a204b09dd6 (patch)
tree9bc0c6a8ca568a2e02e546727f985548fdd5fac7 /lib/CodeGen/SelectionDAG
parent9626447e70a3c8dc88b09f84414ee416a39518b1 (diff)
downloadexternal_llvm-93b7415f4cc9a83126f1d89b2d2f51a204b09dd6.zip
external_llvm-93b7415f4cc9a83126f1d89b2d2f51a204b09dd6.tar.gz
external_llvm-93b7415f4cc9a83126f1d89b2d2f51a204b09dd6.tar.bz2
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')
-rw-r--r--lib/CodeGen/SelectionDAG/DAGCombiner.cpp17
1 files changed, 11 insertions, 6 deletions
diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 3e517cf..db4b392 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();