https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87627
--- Comment #2 from Rich Felker <bugdal at aerifal dot cx> --- Further trial-and-error shows that it seems to be the sibcall itself that causes the mess. My first guess is that something in the RTL considers the whole argument area as clobbered/belonging to the sibcallee as soon as it starts setting up for the sibcall, thereby forcing the arguments to be backed up somewhere else and restored, but I'm not sure why that wouldn't affect the case where there's no intervening call.