[llvm-commits] [llvm] r166125 - in /llvm/trunk: lib/CodeGen/SelectionDAG/DAGCombiner.cpp test/CodeGen/X86/extract-concat.ll

Michael Liao michael.liao at intel.com
Wed Oct 17 15:59:24 PDT 2012


I will fix that test case. - Michael

On Wed, 2012-10-17 at 15:57 -0700, David Blaikie wrote:
> On Wed, Oct 17, 2012 at 1:48 PM, Michael Liao <michael.liao at intel.com> wrote:
> > Author: hliao
> > Date: Wed Oct 17 15:48:33 2012
> > New Revision: 166125
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=166125&view=rev
> > Log:
> > Teach DAG combine to fold (extract_subvec (concat v1, ..) i) to v_i
> >
> > - If the extracted vector has the same type of all vectored being concatenated
> >   together, it should be simplified directly into v_i, where i is the index of
> >   the element being extracted.
> >
> >
> > Added:
> >     llvm/trunk/test/CodeGen/X86/extract-concat.ll
> > Modified:
> >     llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
> >
> > Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=166125&r1=166124&r2=166125&view=diff
> > ==============================================================================
> > --- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
> > +++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Wed Oct 17 15:48:33 2012
> > @@ -8610,8 +8610,8 @@
> >        return SDValue();
> >
> >      // Only handle cases where both indexes are constants with the same type.
> > -    ConstantSDNode *InsIdx = dyn_cast<ConstantSDNode>(N->getOperand(1));
> > -    ConstantSDNode *ExtIdx = dyn_cast<ConstantSDNode>(V->getOperand(2));
> > +    ConstantSDNode *ExtIdx = dyn_cast<ConstantSDNode>(N->getOperand(1));
> > +    ConstantSDNode *InsIdx = dyn_cast<ConstantSDNode>(V->getOperand(2));
> >
> >      if (InsIdx && ExtIdx &&
> >          InsIdx->getValueType(0).getSizeInBits() <= 64 &&
> > @@ -8628,6 +8628,21 @@
> >      }
> >    }
> >
> > +  if (V->getOpcode() == ISD::CONCAT_VECTORS) {
> > +    // Combine:
> > +    //    (extract_subvec (concat V1, V2, ...), i)
> > +    // Into:
> > +    //    Vi if possible
> > +    for (unsigned i = 0, e = V->getNumOperands(); i != e; ++i)
> > +      if (V->getOperand(i).getValueType() != NVT)
> > +        return SDValue();
> > +    unsigned Idx = dyn_cast<ConstantSDNode>(N->getOperand(1))->getZExtValue();
> > +    unsigned NumElems = NVT.getVectorNumElements();
> > +    assert((Idx % NumElems) == 0 &&
> > +           "IDX in concat is not a multiple of the result vector length.");
> > +    return V->getOperand(Idx / NumElems);
> > +  }
> > +
> >    return SDValue();
> >  }
> >
> >
> > Added: llvm/trunk/test/CodeGen/X86/extract-concat.ll
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/extract-concat.ll?rev=166125&view=auto
> > ==============================================================================
> > --- llvm/trunk/test/CodeGen/X86/extract-concat.ll (added)
> > +++ llvm/trunk/test/CodeGen/X86/extract-concat.ll Wed Oct 17 15:48:33 2012
> > @@ -0,0 +1,17 @@
> > +; RUN: llc < %s -mcpu=corei7 -mtriple=x86_64-unknown-linux-gnu | FileCheck %s
> > +
> > +define void @foo(<4 x float> %in, <4 x i8>* %out) {
> > +  %t0 = fptoui <4 x float> %in to <4 x i32>
> > +  %t1 = trunc <4 x i32> %t0 to <4 x i16>
> > +  %t2 = shufflevector <4 x i16> %t1, <4 x i16> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
> > +  %t3 = trunc <8 x i16> %t2 to <8 x i8>
> > +  %t4 = shufflevector <8 x i8> %t3, <8 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
> > +  %t5 = insertelement <4 x i8> %t4, i8 -1, i32 3
> > +  store <4 x i8> %t5, <4 x i8>* %out
> > +  ret void
> > +; CHECK: foo
> > +; CHECK: cvttps2dq
> > +; CHECK-NOT: pextrd
> > +; CHECK: pshufb
> > +; CHECK: ret
> > +}
> 
> Seems to be failing for me:
> 
> /usr/local/google/home/blaikie/Development/llvm/src/test/CodeGen/X86/extract-concat.ll:13:10:
> error: expected string not found in input
> ; CHECK: cvttps2dq
>          ^
> <stdin>:23:2: note: scanning from here
>  .align 16, 0x90
>  ^
> <stdin>:29:2: note: possible intended match here
>  cvttss2siq %xmm1, %rax
>  ^
> 
> Please fix or revert at your earliest convenience.
> 
> For reference, the total output of the llc command is:
> 
>         .file   "<stdin>"
>         .section        .rodata.cst16,"aM", at progbits,16
>         .align  16
> .LCPI0_0:
>         .byte   0                       # 0x0
>         .byte   4                       # 0x4
>         .byte   8                       # 0x8
>         .byte   12                      # 0xc
>         .byte   128                     # 0x80
>         .byte   128                     # 0x80
>         .byte   128                     # 0x80
>         .byte   128                     # 0x80
>         .byte   128                     # 0x80
>         .byte   128                     # 0x80
>         .byte   128                     # 0x80
>         .byte   128                     # 0x80
>         .byte   128                     # 0x80
>         .byte   128                     # 0x80
>         .byte   128                     # 0x80
>         .byte   128                     # 0x80
>         .text
>         .globl  foo
>         .align  16, 0x90
>         .type   foo, at function
> foo:                                    # @foo
>         .cfi_startproc
> # BB#0:
>         pshufd  $1, %xmm0, %xmm1        # xmm1 = xmm0[1,0,0,0]
>         cvttss2siq      %xmm1, %rax
>         cvttss2siq      %xmm0, %rcx
>         movd    %ecx, %xmm1
>         pinsrd  $1, %eax, %xmm1
>         pshufd  $3, %xmm0, %xmm2        # xmm2 = xmm0[3,0,0,0]
>         movhlps %xmm0, %xmm0            # xmm0 = xmm0[1,1]
>         cvttss2siq      %xmm0, %rax
>         pinsrd  $2, %eax, %xmm1
>         cvttss2siq      %xmm2, %rcx
>         movl    $255, %eax
>         pinsrd  $3, %ecx, %xmm1
>         pextrd  $1, %xmm1, %edx
>         pextrd  $2, %xmm1, %ecx
>         pinsrd  $1, %edx, %xmm1
>         pinsrd  $2, %ecx, %xmm1
>         pinsrd  $3, %eax, %xmm1
>         pshufb  .LCPI0_0(%rip), %xmm1
>         movd    %xmm1, (%rdi)
>         ret
> .Ltmp0:
>         .size   foo, .Ltmp0-foo
>         .cfi_endproc
> 
> 
>         .section        ".note.GNU-stack","", at progbits





More information about the llvm-commits mailing list