http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45813
--- Comment #10 from Mikael Pettersson <mikpe at it dot uu.se> 2010-09-29 20:59:17 UTC --- This was fixed for 4.6 by r160260: http://gcc.gnu.org/viewcvs?view=revision&revision=160260 Applying that to 4.5 changes 4.5's output to: ReadLE16U: push {r7, lr} ldrb r3, [r0] sub sp, sp, #8 add r7, sp, #0 strb r3, [r7, #6] ldrb r3, [r0, #1] mov sp, r7 add sp, sp, #8 strb r3, [r7, #7] ldrh r0, [r7, #6] @ sp needed for prologue pop {r7, pc} which is much better. (It still runs into PR38644, but that can be avoided by -fno-schedule-insns2 or by applying my proposed patch for PR38644.)