From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5942 invoked by alias); 11 Jun 2009 14:34:33 -0000 Received: (qmail 5869 invoked by uid 48); 11 Jun 2009 14:34:18 -0000 Date: Thu, 11 Jun 2009 14:34:00 -0000 Message-ID: <20090611143418.5868.qmail@sourceware.org> X-Bugzilla-Reason: CC References: Subject: [Bug target/40416] unnecessary register spill In-Reply-To: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "carrot at google dot com" Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2009-06/txt/msg00713.txt.bz2 ------- 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