------- Comment #1 from carrot at google dot com 2009-06-11 14:34 -------
Created an attachment (id=17983)
--> (http://gcc.gnu.org/bugzilla/attachment.cgi?id=17983&action=view)
test case
The spilling is occurred around the first loop:
push {r4, r5, r6, r7, lr}
sub sp, sp, #12
.loc 1 5 0
str r2, [sp, #4] // A
.loc 1 6 0
add r6, r1, r2
mov r4, r0
.loc 1 8 0
b .L2
.L5:
.loc 1 10 0
mov r7, #0
ldrsh r5, [r4, r7]
.loc 1 12 0
cmp r2, r5
bge .L3
.loc 1 14 0
ldrb r7, [r1]
strb r7, [r1, r2]
.loc 1 15 0
strh r2, [r4]
.loc 1 16 0
lsl r1, r2, #1
sub r2, r5, r2
strh r2, [r1, r4]
.L6:
.loc 1 5 0
ldr r5, [sp, #4] // B
lsl r4, r5, #1
add r0, r0, r4
b .L4
.L3:
.loc 1 19 0
lsl r7, r5, #1
mov ip, r7
add r4, r4, ip
.loc 1 20 0
add r1, r1, r5
.loc 1 21 0
sub r2, r2, r5
.L2:
.loc 1 8 0
cmp r2, #0
bgt .L5
b .L6
.L4:
.loc 1 30 0
mov r1, #0
The spilling is occurred at instruction A and reload at instruction B.
The spilled value is x. The source code computes next_runs and next_alpha
before while loop and preserve them through the loop body. But the generated
code preserve next_alpha, original runs and original x through the loop body
and compute next_runs after the loop. This caused an extra usage of register
and results in a register spilling.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40416