aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2016-05-10 08:42:20 +0930
committerAlan Modra <amodra@gcc.gnu.org>2016-05-10 08:42:20 +0930
commit5def232a0bf5d4c0e521f0d2e0516a14c46e6ee6 (patch)
tree25e62a1bc9665831c988216d9f2a5cf946c4a32f /gcc
parent9491d081fe34ea2706d922941840368401a155e2 (diff)
downloadgcc-5def232a0bf5d4c0e521f0d2e0516a14c46e6ee6.zip
gcc-5def232a0bf5d4c0e521f0d2e0516a14c46e6ee6.tar.gz
gcc-5def232a0bf5d4c0e521f0d2e0516a14c46e6ee6.tar.bz2
[RS6000] Stop regrename twiddling with split-stack prologue
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/rs6000/rs6000.c5
-rw-r--r--gcc/config/rs6000/rs6000.md4
3 files changed, 16 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 42152ef..687ab97 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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,
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 34495f3..007bf57 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -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);
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index ed1989c..349bcca 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -12587,8 +12587,10 @@
(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")])