[llvm-commits] [llvm] r145488 - in /llvm/trunk: lib/Target/X86/X86ISelLowering.cpp test/CodeGen/X86/2011-11-30-or.ll

Eli Friedman eli.friedman at gmail.com
Wed Nov 30 16:21:31 PST 2011


On Wed, Nov 30, 2011 at 2:13 AM, Nadav Rotem <nadav.rotem at intel.com> wrote:
> Author: nadav
> Date: Wed Nov 30 04:13:37 2011
> New Revision: 145488
>
> URL: http://llvm.org/viewvc/llvm-project?rev=145488&view=rev
> Log:
> X86: PerformOrCombine introduced a vselect node with a wrong order of operands. This bug was introduced when a dedicated blend sdnode was replaced with the vselect node (in 139479).
>
>
> Added:
>    llvm/trunk/test/CodeGen/X86/2011-11-30-or.ll
> Modified:
>    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
>
> Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=145488&r1=145487&r2=145488&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Wed Nov 30 04:13:37 2011
> @@ -13903,7 +13903,7 @@
>       X = DAG.getNode(ISD::BITCAST, DL, BlendVT, X);
>       Y = DAG.getNode(ISD::BITCAST, DL, BlendVT, Y);
>       Mask = DAG.getNode(ISD::BITCAST, DL, BlendVT, Mask);
> -      Mask = DAG.getNode(ISD::VSELECT, DL, BlendVT, Mask, X, Y);
> +      Mask = DAG.getNode(ISD::VSELECT, DL, BlendVT, Mask, Y, X);
>       return DAG.getNode(ISD::BITCAST, DL, VT, Mask);
>     }
>   }
>
> Added: llvm/trunk/test/CodeGen/X86/2011-11-30-or.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2011-11-30-or.ll?rev=145488&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/2011-11-30-or.ll (added)
> +++ llvm/trunk/test/CodeGen/X86/2011-11-30-or.ll Wed Nov 30 04:13:37 2011
> @@ -0,0 +1,22 @@
> +; RUN: llc < %s -mcpu=corei7 | FileCheck %s
> +
> +; Test that the order of operands is correct
> +; CHECK: select_func
> +; CHECK: pblendvb        %xmm1, %xmm2
> +; CHECK: ret

This needs to actually verify the contents of xmm1 and xmm2.

-Eli

> +
> +define void @select_func() {
> +entry:
> +  %c.lobit.i.i.i = ashr <8 x i16> <i16 17, i16 5, i16 1, i16 15, i16 19, i16 15, i16 4, i16 1> , <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
> +  %a35 = bitcast <8 x i16> %c.lobit.i.i.i to <2 x i64>
> +  %and.i56.i.i.i = and <8 x i16> %c.lobit.i.i.i, <i16 25, i16 8, i16 65, i16 25, i16 8, i16 95, i16 15, i16 45>
> +  %and.i5.i.i.i = bitcast <8 x i16> %and.i56.i.i.i to <2 x i64>
> +  %neg.i.i.i.i = xor <2 x i64> %a35, <i64 -1, i64 -1>
> +  %and.i.i.i.i = and <2 x i64> zeroinitializer, %neg.i.i.i.i
> +  %or.i.i.i.i = or <2 x i64> %and.i.i.i.i, %and.i5.i.i.i
> +  %a37 = bitcast <2 x i64> %or.i.i.i.i to <8 x i16>
> +  store <8 x i16> %a37, <8 x i16> addrspace(1)* undef, align 4
> +  ret void
> +}




More information about the llvm-commits mailing list