Jeff Law wrote: > On 09/09/2017 02:51 AM, Eric Botcazou wrote: > >> No, the stack never gets misaligned - my patch doesn't change that at all. > > > > Yes, it does. Dynamic allocation works like this: the amount to be > > allocated > > is added to VIRTUAL_STACK_DYNAMIC_REGNUM and the result is then dynamically > > aligned. Your patch assumes that VIRTUAL_STACK_DYNAMIC_REGNUM is as > > aligned > > as the stack pointer, i.e. STACK_BOUNDARY, but that's wrong for 32-bit > > SPARC > > at least (that's why I put the ??? note at line 5746 in emit-rtl.c). > This seems like a SPARC target problem to me -- essentially it's > claiming a higher STACK_BOUNDARY than it really has. > > Presumably there's a good reason for this and some kind of hack may be > needed to deal with it in dynamically allocated space. But it does not > seem like we should be forcing all targets to allocate unnecessary space > to deal with this.
It's not just STACK_BOUNDARY, the outgoing argument offset is incorrect too. These snippets of code from PR78468 (comment 20) look very wrong: sub %sp, %g2, %sp add %sp, 108, %g3 ; g3 = fp - 28 (x) sub %sp, %g2, %sp add %sp, 108, %g2 ; g2 = fp - 44 (d) sub %sp, %g1, %sp add %sp, 112, %g1 ; g1 = fp - 56 (e) There are several different outgoing argument offsets used here (108 and 112). This not only results in alloca blocks being unaligned (when they should be at least aligned to STACK_BOUNDARY, ideally PREFERRED_STACK_BOUNDARY), but this also means you end up with different alloca blocks overlapping and corrupting each other in non-trivial ways... Wilco