Ping. https://gcc.gnu.org/ml/gcc-patches/2015-03/msg01014.html
Jeff, could you help review this patch? Or could you point me to someone who can review this? I can't figure out from MAINTAINERS who should be in charge of this part of the compiler. Thanks, Kyrill On 19/03/15 14:39, Kyrill Tkachov wrote:
Hi all, This patch fixes PR 65358. For details look at the excellent write-up by Honggyu in bugzilla. The problem is that we're trying to pass a struct partially on the stack and partially in regs during a tail-call optimisation but the struct we're passing is also a partial incoming arg though the split between stack and regs is different from its outgoing usage. The emit_push_insn code ends up doing a block move for the on-stack part but ends up overwriting the part that needs to be loaded into regs. My first thought was to just load the regs part first and then do the stack part but that doesn't work as multiple comments in that function indicate (the block move being expanded to movmem or other functions being one of the reasons). My proposed solution is to detect when the overlap happens, find the overlapping region and load it before the stack pushing into pseudos and after the stack pushing is done move the overlapping values from the pseudos into the hard argument regs that they're supposed to go. That way this new functionality should only ever be triggered when there's the overlap in this PR (causing wrong-code) and shouldn't affect codegen anywhere else. Bootstrapped and tested on arm-none-linux-gnueabihf, aarch64-none-linux-gnu and x86_64-linux-gnu. According to the PR this appears at least as far back 4.6 so this isn't a regression on the release branches, but it is a wrong-code bug. I'll let Honggyu upstream the testcase separately (https://gcc.gnu.org/ml/gcc-patches/2015-03/msg00984.html) I'll be testing this on the 4.8 and 4.9 branches. Thoughts on this approach? Thanks, Kyrill 2015-03-19 Kyrylo Tkachov <kyrylo.tkac...@arm.com> PR middle-end/65358 * expr.c (memory_load_overlap): New function. (emit_push_insn): When pushing partial args to the stack would clobber the register part load the overlapping part into a pseudo and put it into the hard reg after pushing.