diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 726108a9976..19723ba1b60 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -4953,7 +4953,8 @@ SDOperand DAGCombiner::visitVECTOR_SHUFFLE(SDNode *N) { // look though conversions that change things like v4f32 to v2f64. if (V->getOpcode() == ISD::BIT_CONVERT) { SDOperand ConvInput = V->getOperand(0); - if (ConvInput.getValueType().getVectorNumElements() == NumElts) + if (ConvInput.getValueType().isVector() && + ConvInput.getValueType().getVectorNumElements() == NumElts) V = ConvInput.Val; } diff --git a/test/CodeGen/X86/2008-07-22-CombinerCrash.ll b/test/CodeGen/X86/2008-07-22-CombinerCrash.ll new file mode 100644 index 00000000000..a18564f4f97 --- /dev/null +++ b/test/CodeGen/X86/2008-07-22-CombinerCrash.ll @@ -0,0 +1,16 @@ +; RUN: llvm-as < %s | llc -march=x86 -mattr=+sse2 +; PR2566 + +external global i16 ; :0 [#uses=1] +external global <4 x i16> ; <<4 x i16>*>:1 [#uses=1] + +declare void @abort() + +define void @t() nounwind { + load i16* @0 ; :1 [#uses=1] + zext i16 %1 to i64 ; :2 [#uses=1] + bitcast i64 %2 to <4 x i16> ; <<4 x i16>>:3 [#uses=1] + shufflevector <4 x i16> %3, <4 x i16> undef, <4 x i32> zeroinitializer ; <<4 x i16>>:4 [#uses=1] + store <4 x i16> %4, <4 x i16>* @1 + ret void +}