From: Eli Friedman Date: Thu, 19 Jun 2008 06:09:51 +0000 (+0000) Subject: Fix a bug with <8 x i16> shuffle lowering on X86 where parts of the X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=2c8e64d3e4a3daca9ec74c617a518d03d33eee90;p=oota-llvm.git Fix a bug with <8 x i16> shuffle lowering on X86 where parts of the shuffle could be skipped. The check is invalid because the loop index i doesn't correspond to the element actually inserted. The correct check is already done a few lines earlier, for whether the element is already in the right spot, so this shouldn't have any effect on the codegen for code that was already correct. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@52486 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 4211508225f..79629240b35 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -3445,8 +3445,6 @@ SDOperand LowerVECTOR_SHUFFLEv8i16(SDOperand V1, SDOperand V2, continue; SDOperand Elt = MaskElts[i]; unsigned EltIdx = cast(Elt)->getValue(); - if (EltIdx == i) - continue; SDOperand ExtOp = (EltIdx < 8) ? DAG.getNode(ISD::EXTRACT_VECTOR_ELT, MVT::i16, V1, DAG.getConstant(EltIdx, PtrVT)) diff --git a/test/CodeGen/X86/2008-06-18-BadShuffle.ll b/test/CodeGen/X86/2008-06-18-BadShuffle.ll new file mode 100644 index 00000000000..ba0a1f90ab9 --- /dev/null +++ b/test/CodeGen/X86/2008-06-18-BadShuffle.ll @@ -0,0 +1,10 @@ +; RUN: llvm-as < %s | llc -march=x86 -mcpu=i386 -mattr=+sse2 | grep pinsrw + +; Test to make sure we actually insert the bottom element of the vector +define <8 x i16> @a(<8 x i16> %a) nounwind { +entry: + shufflevector <8 x i16> %a, <8 x i16> zeroinitializer, <8 x i32> < i32 0, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8 > + %add = add <8 x i16> %0, %a + ret <8 x i16> %add +} +