[LLVMbugs] [Bug 17090] New: Poor codegen for loading and storing arrays
bugzilla-daemon at llvm.org
bugzilla-daemon at llvm.org
Tue Sep 3 15:27:45 PDT 2013
http://llvm.org/bugs/show_bug.cgi?id=17090
Bug ID: 17090
Summary: Poor codegen for loading and storing arrays
Product: libraries
Version: trunk
Hardware: PC
OS: Windows NT
Status: NEW
Severity: normal
Priority: P
Component: Common Code Generator Code
Assignee: unassignedbugs at nondot.org
Reporter: nick at indigorenderer.com
CC: llvmbugs at cs.uiuc.edu
Classification: Unclassified
I've noticed that loading and storing an LLVM array value seems to produce
quite slow code - loading and storing each element in the array individually.
Using a memcpy intrinsic, by contrast, uses MOVUPS instead.
Here is the IR:
; ModuleID = 'WinterModule'
target datalayout =
"e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
; Function Attrs: nounwind
define void @"main(array<float, 4>, array<float, 4>)"([4 x float]* noalias
nocapture sret %ret, [4 x float]* noalias nocapture %a, [4 x float]* noalias
nocapture %b, i32* nocapture %hidden) #0 {
entry:
%0 = load [4 x float]* %a, align 4
store [4 x float] %0, [4 x float]* %ret, align 4
ret void
}
attributes #0 = { nounwind }
And here is the produced code:
# After PreEmit passes:
# Machine code for function main(array<float, 4>, array<float, 4>): Post SSA,
no
t tracking liveness
Function Live Ins: %RCX in %vreg0, %RDX in %vreg1
BB#0: derived from LLVM BB %entry
Live Ins: %RCX %RDX
%XMM0<def> = MOVSSrm %RDX, 1, %noreg, 0, %noreg; mem:LD4[%a]
%XMM1<def> = MOVSSrm %RDX, 1, %noreg, 4, %noreg; mem:LD4[%a+4]
%XMM2<def> = MOVSSrm %RDX, 1, %noreg, 8, %noreg; mem:LD4[%a+8]
%XMM3<def> = MOVSSrm %RDX<kill>, 1, %noreg, 12, %noreg; mem:LD4[%a+12]
MOVSSmr %RCX, 1, %noreg, 12, %noreg, %XMM3<kill>; mem:ST4[%ret+12]
MOVSSmr %RCX, 1, %noreg, 8, %noreg, %XMM2<kill>; mem:ST4[%ret+8]
MOVSSmr %RCX, 1, %noreg, 4, %noreg, %XMM1<kill>; mem:ST4[%ret+4]
MOVSSmr %RCX, 1, %noreg, 0, %noreg, %XMM0<kill>; mem:ST4[%ret]
%RAX<def> = MOV64rr %RCX<kill>
RET %RAX<kill>
# End machine code for function main(array<float, 4>, array<float, 4>).
This is with LLVM 3.3.
--
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20130903/dd68d4cf/attachment.html>
More information about the llvm-bugs
mailing list