https://gcc.gnu.org/bugzilla/show_bug.cgi?id=74585
--- Comment #5 from Bill Schmidt <wschmidt at gcc dot gnu.org> --- (In reply to Richard Biener from comment #1) > The issue is not SRA pushing things to memory - it doesn't. The issue is > that in the GIMPLE IL the parameter appears as "memory" as it is an > aggregate type. > > The issue is really RTL expansion of the argument (not sure where that's > done) > which doesn't take into account that we could happily expand > > a$vx0_27 = MEM[(struct *)&a]; > a$vx1_28 = MEM[(struct *)&a + 16B]; > a$vx2_29 = MEM[(struct *)&a + 32B]; > a$vx3_30 = MEM[(struct *)&a + 48B]; > > if a is expanded to registers. > OK, I'll investigate further. But the assumption that an aggregate parameter is "memory" seems wrong to me. SRA is explicitly taking the address of a parameter which has not previously had its address taken, so it seems to me that if it's passed in registers this in itself will force it to memory on procedure entry, despite whatever else is currently going on with -fno-tree-sra. But this is all talk, I need to do some digging to see what the issues are. To me the SRA transformation seemed "obviously" :) wrong, so I stopped looking...