From 523c0852c65ac9b51f47002b7e4a76dc05b6f14a Mon Sep 17 00:00:00 2001 From: Mon P Wang Date: Tue, 17 Mar 2009 06:33:10 +0000 Subject: [PATCH] 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. llvm-svn: 67076 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 17 +++++++++++------ llvm/test/CodeGen/X86/dagcombine-buildvector.ll | 13 +++++++++++++ 2 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 llvm/test/CodeGen/X86/dagcombine-buildvector.ll diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 3e517cfe3a1d..db4b39272333 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/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 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(ExtVal)->getZExtValue(); + BuildVecIndices.push_back(DAG.getConstant(Idx, IndexVT)); + } continue; } // Otherwise, use InIdx + VecSize - unsigned Idx = - cast(Extract.getOperand(1))->getZExtValue(); - BuildVecIndices.push_back(DAG.getIntPtrConstant(Idx+NumInScalars)); + unsigned Idx = cast(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(); diff --git a/llvm/test/CodeGen/X86/dagcombine-buildvector.ll b/llvm/test/CodeGen/X86/dagcombine-buildvector.ll new file mode 100644 index 000000000000..2ca417791901 --- /dev/null +++ b/llvm/test/CodeGen/X86/dagcombine-buildvector.ll @@ -0,0 +1,13 @@ +; 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