[Bug target/43814] New: gcc failed to inline memcpy
carrot at google dot com
gcc-bugzilla@gcc.gnu.org
Tue Apr 20 09:02:00 GMT 2010
Attached is a simplified test case from dalvik VM. Compile it with options
-march=armv7-a -mthumb -Os -finline-functions, gcc generates
Dalvik_sun_misc_Unsafe_getObject:
push {r0, r1, r2, r4, r5, lr}
ldr r5, [r0, #4]
mov r4, r1
movs r2, #8
add r1, r0, #8
mov r0, sp
bl memcpy
ldr r3, [sp, #0]
ldr r3, [r5, r3]
str r3, [r4, #0]
pop {r1, r2, r3, r4, r5, pc}
If we inline memcpy, the result can be
LDRD r2,r0,[r0,#4]
LDR r0,[r2,r0]
STR r0,[r1,#0]
BX lr
There are at least 2 problems prevent it to be inlined for target arm.
1. In function emit_block_move_hints, for some unknown reason, the alignment is
wrongly computed as 8 bits.
2. The MOVE_RATIO defined in arm.h is too small.
#define MOVE_RATIO(speed) (arm_tune_xscale ? 4 : 2)
It means only when we move 1 unit of memory, then the memcpy can get a chance
to be inlined.
--
Summary: gcc failed to inline memcpy
Product: gcc
Version: 4.6.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: carrot at google dot com
GCC build triplet: i686-linux
GCC host triplet: i686-linux
GCC target triplet: arm-eabi
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43814
More information about the Gcc-bugs
mailing list