From beb66de0f926dba66a4d0a248a975df427e841f2 Mon Sep 17 00:00:00 2001 From: Elena Demikhovsky Date: Thu, 12 Jan 2012 20:33:10 +0000 Subject: [PATCH] Fixed a bug in LowerVECTOR_SHUFFLE caused assertion failure lc: X86ISelLowering.cpp:6480: llvm::SDValue llvm::X86TargetLowering::LowerVECTOR_SHUFFLE(llvm::SDValue, llvm::SelectionDAG&) const: Assertion `V1.getOpcode() != ISD::UNDEF&& "Op 1 of shuffle should not be undef"' failed. Added a test. llvm-svn: 148044 --- lib/Target/X86/X86ISelLowering.cpp | 6 +++++- test/CodeGen/X86/avx-shuffle.ll | 10 +++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index c643cefb6c0..6a5e6f5f240 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -6464,6 +6464,7 @@ X86TargetLowering::LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const { EVT VT = Op.getValueType(); DebugLoc dl = Op.getDebugLoc(); unsigned NumElems = VT.getVectorNumElements(); + bool V1IsUndef = V1.getOpcode() == ISD::UNDEF; bool V2IsUndef = V2.getOpcode() == ISD::UNDEF; bool V1IsSplat = false; bool V2IsSplat = false; @@ -6475,7 +6476,10 @@ X86TargetLowering::LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) const { assert(VT.getSizeInBits() != 64 && "Can't lower MMX shuffles"); - assert(V1.getOpcode() != ISD::UNDEF && "Op 1 of shuffle should not be undef"); + if (V1IsUndef && V2IsUndef) + return DAG.getUNDEF(VT); + + assert(!V1IsUndef && "Op 1 of shuffle should not be undef"); // Vector shuffle lowering takes 3 steps: // diff --git a/test/CodeGen/X86/avx-shuffle.ll b/test/CodeGen/X86/avx-shuffle.ll index ad611fc1b53..bb55ab6acdb 100644 --- a/test/CodeGen/X86/avx-shuffle.ll +++ b/test/CodeGen/X86/avx-shuffle.ll @@ -54,4 +54,12 @@ entry: ; CHECK-NOT: vinsertf128 %shuffle.i = shufflevector <2 x double> %1, <2 x double> , <4 x i32> ret <4 x double> %shuffle.i -} \ No newline at end of file +} + +define <16 x i16> @test7(<4 x i16> %a) nounwind { +; CHECK: test7 + + %b = shufflevector <4 x i16> %a, <4 x i16> undef, <16 x i32> + ret <16 x i16> %b +} +