On Thu, Apr 12, 2012 at 9:22 AM, Alan Modra <amo...@gmail.com> wrote:
> I tried that. It doesn't work without something else in the insn to > stop rtl-dce deleting it, so you may as well use SETs. But thanks for > the prod in the right direction. We do get slightly better results > when the regs are not hidden away in an UNSPEC, for instance > non-stack writes/reads are seen by the alias oracle to not conflict > with the epilogue frame deallocation. > > Bootstrapped etc. powerpc-linux. OK to apply, David? > > PR target/52828 > * config/rs6000/rs6000.c (rs6000_emit_stack_tie): Rewrite with > tie regs on destination of sets. Delete forward declaration. > (rs6000_emit_stack_reset): Update rs6000_emit_stack_tie calls. > (rs6000_emit_prologue): Likewise. > (rs6000_emit_epilogue): Likewise. Use in place of gen_frame_tie > and gen_stack_tie. > (is_mem_ref): Use tie_operand to recognise stack ties. > * config/rs6000/predicates.md (tie_operand): New. > * config/rs6000/rs6000.md (UNSPEC_TIE): Delete. > (restore_stack_block): Generate new stack tie rtl. > (restore_stack_nonlocal): Likewise. > (stack_tie): Update. > (frame_tie): Delete. This probably is getting close to the best we can do with GCC's RTL alias analysis infrastructure. This version is okay, but I also want to give Richi and Olivier an opportunity to comment if they still have any concerns. Thanks, David