This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
target/7056: [ARM] zero extend code worse in 3.1 than 3.0
- From: pb at nexus dot co dot uk
- To: gcc-gnats at gcc dot gnu dot org
- Date: 17 Jun 2002 13:09:27 -0000
- Subject: target/7056: [ARM] zero extend code worse in 3.1 than 3.0
- Reply-to: pb at nexus dot co dot uk
>Number: 7056
>Category: target
>Synopsis: [ARM] zero extend code worse in 3.1 than 3.0
>Confidential: no
>Severity: serious
>Priority: medium
>Responsible: unassigned
>State: open
>Class: pessimizes-code
>Submitter-Id: net
>Arrival-Date: Mon Jun 17 06:16:01 PDT 2002
>Closed-Date:
>Last-Modified:
>Originator: pb@nexus.co.uk
>Release: gcc-3.1
>Organization:
>Environment:
arm-linux
>Description:
See code below.
With gcc-3.0 -O2, this yields
stmfd sp!, {r4, lr}
ldrb r3, [r0], #1 @ zero_extendqisi2
ldrb r4, [r0, #0] @ zero_extendqisi2
mov r0, r3
bl g
mov r0, r4
@ Sibcall epilogue
ldmfd sp!, {r4, lr}
b g
With gcc-3.1, there is an extra, redundant, AND instruction:
stmfd sp!, {r4, lr}
ldrb r3, [r0], #1
and r3, r3, #255
ldrb r4, [r0, #0] @ zero_extendqisi2
mov r0, r3
bl g
mov r0, r4
@ Sibcall epilogue
ldmfd sp!, {r4, lr}
b g
>How-To-Repeat:
void f(unsigned char *p)
{
unsigned long int a,b;
a = *p++;
b = *p++;
g(a);
g(b);
}
>Fix:
>Release-Note:
>Audit-Trail:
>Unformatted: