[LLVMbugs] [Bug 7279] New: GVN emits expensive BitCast

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Tue Jun 1 21:05:27 PDT 2010


http://llvm.org/bugs/show_bug.cgi?id=7279

           Summary: GVN emits expensive BitCast
           Product: libraries
           Version: trunk
          Platform: PC
        OS/Version: Windows NT
            Status: NEW
          Severity: normal
          Priority: P
         Component: Scalar Optimizations
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: geek4civic at gmail.com
                CC: llvmbugs at cs.uiuc.edu, geek4civic at gmail.com


; ---- a testcase
target datalayout =
"e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32"
target triple = "i386-mingw32"

define void @xg(i8* %p, i8* %q) nounwind {
entry:
  %0 = bitcast i8* %p to double*
  %1 = load double* %0, align 8
  %2 = bitcast i8* %q to double*
  %3 = load double* %2, align 8
  %4 = fcmp olt double %1, %3
  br i1 %4, label %return, label %bb

bb:
  %5 = load i8* %p, align 1
  %6 = load i8* %q, align 1
  store i8 %6, i8* %p, align 1
  store i8 %5, i8* %q, align 1
  %7 = getelementptr inbounds i8* %p, i32 1
  %8 = load i8* %7, align 1
  %9 = getelementptr inbounds i8* %q, i32 1
  %10 = load i8* %9, align 1
  %11 = getelementptr inbounds i8* %p, i32 1
  store i8 %10, i8* %11, align 1
  %12 = getelementptr inbounds i8* %q, i32 1
  store i8 %8, i8* %12, align 1
  ret void

return:
  ret void
}
---- after -gvn
define void @xg(i8* %p, i8* %q) nounwind {
entry:
  %0 = bitcast i8* %p to double*
  %1 = load double* %0, align 8
  %2 = bitcast i8* %q to double*
  %3 = load double* %2, align 8
  %4 = fcmp olt double %1, %3
  %tmp = bitcast double %1 to i64 ;!!!
  %tmp1 = trunc i64 %tmp to i8
  %tmp2 = bitcast double %3 to i64 ;!!!
  %tmp3 = trunc i64 %tmp2 to i8
  br i1 %4, label %return, label %bb

bb:
  store i8 %tmp3, i8* %p, align 1
  store i8 %tmp1, i8* %q, align 1
  %5 = getelementptr inbounds i8* %p, i32 1
  %6 = load i8* %5, align 1
  %7 = getelementptr inbounds i8* %q, i32 1
  %8 = load i8* %7, align 1
  store i8 %8, i8* %5, align 1
  store i8 %6, i8* %7, align 1
  ret void

return:
  ret void
}
---- llc-generated code
_xg:                                    # @xg
# BB#0:                                 # %entry
    subl    $20, %esp
    movl    24(%esp), %eax
    movsd    (%eax), %xmm0
    movsd    %xmm0, 8(%esp) ;!!!
    movl    28(%esp), %ecx
    movsd    (%ecx), %xmm1
    movsd    %xmm1, (%esp)  ;!!!
    ucomisd    %xmm0, %xmm1
    ja    LBB0_2
# BB#1:                                 # %bb
    movb    (%esp), %dl    ;...
    movb    8(%esp), %dh   ;...
    movb    %dl, (%eax)
    movb    %dh, (%ecx)
    movb    1(%eax), %dl
    movb    1(%ecx), %dh
    movb    %dh, 1(%eax)
    movb    %dl, 1(%ecx)
LBB0_2:                                 # %return
    addl    $20, %esp
    ret
----
BitCast double to i64 would be expensive.
(Core2 and Nehalem could do efficiently with movd xmm to gpr)

-- 
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