[LLVMbugs] [Bug 2109] New: Missed optimization for extract/ insertelements equivalent to movhps

bugzilla-daemon at cs.uiuc.edu bugzilla-daemon at cs.uiuc.edu
Wed Feb 27 19:52:03 PST 2008


           Summary: Missed optimization for extract/insertelements
                    equivalent to movhps
           Product: new-bugs
           Version: unspecified
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P2
         Component: new bugs
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: sharparrow1 at yahoo.com
                CC: llvmbugs at cs.uiuc.edu

Take the following bitcode

define <4 x float> @_mm_loadh_pi22(<4 x float> %__A, <2 x i32>* %__P) nounwind 
        load <2 x i32>* %__P
        bitcast <2 x i32> %0 to <2 x float>
        extractelement <2 x float> %1, i32 0
        extractelement <2 x float> %1, i32 1
        insertelement <4 x float> %__A, float %2, i32 2
        insertelement <4 x float> %4, float %3, i32 3
        ret <4 x float> %5

This currently codegens to the following:
        subl    $8, %esp
        movl    12(%esp), %eax
        movl    4(%eax), %ecx
        movl    %ecx, 4(%esp)
        movl    (%eax), %eax
        movl    %eax, (%esp)
        movss   (%esp), %xmm1
        movaps  %xmm0, %xmm2
        shufps  $3, %xmm1, %xmm2
        shufps  $36, %xmm2, %xmm0
        movss   4(%esp), %xmm1
        movaps  %xmm0, %xmm2
        shufps  $2, %xmm1, %xmm2
        shufps  $132, %xmm2, %xmm0
        addl    $8, %esp

Unless I've made a mistake, this should codegen to the following:
        movl    4(%esp), %eax
        movhps  (%eax), %xmm0

Note that LLVM does know how to generate movhps... it does in fact generate it
for the following, which is functionally equivalent:
define <4 x float> @_mm_loadh_pi22(<4 x float> %__A, <1 x i64>* %__P) nounwind 
        %tmp4 = bitcast <1 x i64>* %__P to double*
        %tmp5 = load double* %tmp4
        %tmp6 = insertelement <2 x double> undef, double %tmp5, i32 0
        %tmp8 = bitcast <2 x double> %tmp6 to <4 x float>
        %tmp9 = shufflevector <4 x float> %__A, <4 x float> %tmp8, <4 x i32> <
i32 0, i32 1, i32 4, i32 5 >
        ret <4 x float> %tmp9

Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.

More information about the llvm-bugs mailing list