http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58166
Bug ID: 58166
Summary: ARMv5: poor register allocation in function containing
smull instruction
Product: gcc
Version: 4.9.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: jay.foad at gmail dot com
Created attachment 30660
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=30660&action=edit
C source for testcase
On the attached test case I get:
$ gcc -marm -S -O2 mul.c -o - -fomit-frame-pointer -march=armv5
...
mul:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
str r4, [sp, #-4]!
smull r3, r4, r0, r1
mov r1, r4
mov r0, r3
ldr r4, [sp], #4
bx lr
If the register allocator picked r2 and r3 for the result of the multiply, then
there would be no need to push and pop r4.
I'm using gcc built from svn r201719 configured with --target=arm-eabi.