https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87627
--- Comment #1 from Rich Felker <bugdal at aerifal dot cx> --- Results are similarly bad for 64-bit, except at -Os where it effectively just pushes/pops the argument registers around the call to bar rather than allocating call-saved registers for them. Using -Os on 32-bit does not help. -O0 does suppress the register shuffling but also suppresses the tail call.