[RS6000] Stop regrename twiddling with split-stack prologue
authorAlan Modra <amodra@gmail.com>
Mon, 9 May 2016 23:12:20 +0000 (08:42 +0930)
committerAlan Modra <amodra@gcc.gnu.org>
Mon, 9 May 2016 23:12:20 +0000 (08:42 +0930)
PR target/70947
* config/rs6000/rs6000.c (rs6000_expand_split_stack_prologue): Stop
regrename modifying insns saving lr before __morestack call.
* config/rs6000/rs6000.md (split_stack_return): Similarly for
insns restoring lr after __morestack call.

From-SVN: r236052

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.md

index 42152ef20c4eb80a46f7cc2d0f18d028a1eb675d..687ab97b4502916f3e6542c1b50d26dc10748a19 100644 (file)
@@ -1,3 +1,11 @@
+2016-05-10  Alan Modra  <amodra@gmail.com>
+
+       PR target/70947
+       * config/rs6000/rs6000.c (rs6000_expand_split_stack_prologue): Stop
+       regrename modifying insns saving lr before __morestack call.
+       * config/rs6000/rs6000.md (split_stack_return): Similarly for
+       insns restoring lr after __morestack call.
+
 2016-05-09  Jakub Jelinek  <jakub@redhat.com>
 
        * config/i386/i386.md (set_got, set_got_labelled, lwp_llwpcb,
index 34495f3c99d0c41e9d47d68e6314553f1c52afcd..007bf5758d8d2caf193e284edcc270161b306e8b 100644 (file)
@@ -27993,6 +27993,11 @@ rs6000_expand_split_stack_prologue (void)
                                   const0_rtx, const0_rtx));
   call_fusage = NULL_RTX;
   use_reg (&call_fusage, r12);
+  /* Say the call uses r0, even though it doesn't, to stop regrename
+     from twiddling with the insns saving lr, trashing args for cfun.
+     The insns restoring lr are similarly protected by making
+     split_stack_return use r0.  */
+  use_reg (&call_fusage, r0);
   add_function_usage_to (insn, call_fusage);
   emit_insn (gen_frame_load (r0, r1, info->lr_save_offset));
   insn = emit_move_insn (lr, r0);
index ed1989cd2a633aa24b7f29480bd175f9c7a365fb..349bcca62e47e3d8777149d881e3d53fed17617c 100644 (file)
    (set_attr "indexed" "no")])
 
 ;; A return instruction which the middle-end doesn't see.
+;; Use r0 to stop regrename twiddling with lr restore insns emitted
+;; after the call to __morestack.
 (define_insn "split_stack_return"
-  [(unspec_volatile [(const_int 0)] UNSPECV_SPLIT_STACK_RETURN)]
+  [(unspec_volatile [(use (reg:SI 0))] UNSPECV_SPLIT_STACK_RETURN)]
   ""
   "blr"
   [(set_attr "type" "jmpreg")])