Fix pr2566: incorrect assumption about bit_convert. It doesn't not have to output...
authorEvan Cheng <evan.cheng@apple.com>
Tue, 22 Jul 2008 20:42:56 +0000 (20:42 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Tue, 22 Jul 2008 20:42:56 +0000 (20:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53932 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/DAGCombiner.cpp
test/CodeGen/X86/2008-07-22-CombinerCrash.ll [new file with mode: 0644]

index 726108a9976aeaffbe4b37bb6e30c0e57874b518..19723ba1b60603be364d6439a3c43ec250096479 100644 (file)
@@ -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 (file)
index 0000000..a18564f
--- /dev/null
@@ -0,0 +1,16 @@
+; RUN: llvm-as < %s | llc -march=x86 -mattr=+sse2
+; PR2566
+
+external global i16            ; <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            ; <i16>:1 [#uses=1]
+       zext i16 %1 to i64              ; <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
+}