https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118732
Bug ID: 118732 Summary: [15 regression] caller-saves optimization can inhibit shrink wrapping Product: gcc Version: 15.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: rearnsha at gcc dot gnu.org CC: jskumari at gcc dot gnu.org, vmakarov at redhat dot com Target Milestone: --- Target: arm aarch64 The patch to fix PR111673 introduced a regression on Arm and AArch64 (and maybe elsewhere) in that we now more aggressively generate caller-save registers, but can place them before an early branch. This means that the shrink wrap code cannot operate properly as it cannot save the register before the initial branch unless the stack frame has been set up. Consider for example: void f(int *i) { if (!i) return; else { __builtin_printf("Hi"); *i=0; } } In gcc-14 this would be shrink-wrapped to give cbz x0, done ... body ... done: ret With gcc-15 there is a store of the parameter i onto the stack, but this is placed before the conditional branch and this is enough to block shrink-wrapping str x0, [sp, offset] cbz x0, done ... body ... It's not clear to me why the store has to be placed before the branch: the stack slot is dead if we do not enter body, so this is worse code anyway even if we don't shrink wrap.