https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113180
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Target|mips aarch64*-*-* |mips aarch64*-*-* arm*-* --- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- arm is just as bad: ``` xx: @ args = 8, pretend = 0, frame = 8 @ frame_needed = 0, uses_anonymous_args = 0 @ link register save eliminated. sub sp, sp, #8 mov r3, r0 strd r1, r2, [sp] ldr r1, [sp, #8] ldrb r2, [sp, #7] @ zero_extendqisi2 bfi r2, r1, #4, #4 strb r2, [sp, #7] ldrd r0, r1, [sp] stm r3, {r0, r1} mov r0, r3 add sp, sp, #8 @ sp needed bx lr ``` Basically the variable a is stored to the stack and then modified and then stored to the stack and then loaded and stored to the return location. This is all due to STRICT alignment IIRC.