}
// 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();
--- /dev/null
+; RUN: llvm-as < %s | llc -march=x86 -o %t -f
+; RUN: grep unpcklpd %t | count 1
+; RUN: grep movapd %t | count 1
+
+; Shows a dag combine bug that will generate an illegal build vector
+; with v2i64 build_vector i32, i32.
+
+define void @test(<2 x double>* %dst, <4 x double> %src) {
+entry:
+ %tmp7.i = shufflevector <4 x double> %src, <4 x double> undef, <2 x i32> < i32 0, i32 2 >
+ store <2 x double> %tmp7.i, <2 x double>* %dst
+ ret void
+}
\ No newline at end of file