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