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

Reply via email to