[Bug rtl-optimization/43491] New: Unnecessary temporary for global register variable
mirq-gccboogs at rere dot qmqm dot pl
gcc-bugzilla@gcc.gnu.org
Tue Mar 23 14:21:00 GMT 2010
gcc sometimes allocates a temporary register for a variable that is global and
has a fixed register. This happens when:
a. the global is a register-fixed variable
b. global is a pointer to structure
c. an address of structure's field is passed as argument to inlined function
d. the global is marked as constant
code:
struct b {
unsigned g,h,j;
};
register struct b *const reg asm("r4");
static inline int diff(unsigned *p)
{
return *p;
}
void c(void);
void d(void)
{
while (diff(®->j))
c();
}
generates:
d:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
ldr r3, [r4, #8] @ first ok
push {r5, lr}
mov r5, r4 @ an temporary even when r4 is marked const
cbz r3, .L1
.L4:
bl c
ldr r3, [r5, #8] @ accesses via temporary
cmp r3, #0
bne .L4
.L1:
pop {r5, pc}
--
Summary: Unnecessary temporary for global register variable
Product: gcc
Version: 4.5.0
Status: UNCONFIRMED
Severity: enhancement
Priority: P3
Component: rtl-optimization
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: mirq-gccboogs at rere dot qmqm dot pl
GCC build triplet: i686-pc-linux-gnu
GCC host triplet: i686-pc-linux-gnu
GCC target triplet: arm-none-eabi
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43491
More information about the Gcc-bugs
mailing list