aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2000-09-18 16:45:48 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2000-09-18 16:45:48 +0000
commit40fc375d0af62c9f990bc147f280d6eecdef9d80 (patch)
tree54863b987e32c75da10f41bf7136b114881a6ce0
parent55eec6605c16043daf8604c66a5a8d5e3e37c720 (diff)
downloadgcc-40fc375d0af62c9f990bc147f280d6eecdef9d80.zip
gcc-40fc375d0af62c9f990bc147f280d6eecdef9d80.tar.gz
gcc-40fc375d0af62c9f990bc147f280d6eecdef9d80.tar.bz2
sh.c (sh_expand_prologue): Mark GOTaddr2picreg as MAYBE_DEAD.
* config/sh/sh.c (sh_expand_prologue): Mark GOTaddr2picreg as MAYBE_DEAD. (sh_expand_epilogue): Take the PIC register into account when computing the frame size. From-SVN: r36496
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/sh/sh.c22
2 files changed, 24 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 368cab3..ae81594 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2000-09-18 Alexandre Oliva <aoliva@redhat.com>
+ * config/sh/sh.c (sh_expand_prologue): Mark GOTaddr2picreg as
+ MAYBE_DEAD.
+ (sh_expand_epilogue): Take the PIC register into account when
+ computing the frame size.
+
* config/sh/sh.c (nonpic_symbol_mentioned_p): Check LABEL_REFs.
* config/sh/sh.md (sym_label2reg, symPLT_label2reg): Protect
LABEL_REFs with a PIC-safe unspec.
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index 903f1c5..1807916 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -3950,7 +3950,17 @@ sh_expand_prologue ()
if (flag_pic && (current_function_uses_pic_offset_table
|| regs_ever_live[PIC_OFFSET_TABLE_REGNUM]))
- emit_insn (gen_GOTaddr2picreg ());
+ {
+ rtx insn = get_last_insn ();
+ rtx insn_end = emit_insn (gen_GOTaddr2picreg ());
+ while (insn != insn_end)
+ {
+ insn = NEXT_INSN (insn);
+ REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_MAYBE_DEAD,
+ const0_rtx,
+ REG_NOTES (insn));
+ }
+ }
if (target_flags != save_flags)
emit_insn (gen_toggle_sz ());
@@ -3976,6 +3986,14 @@ sh_expand_epilogue ()
live_regs_mask = calc_live_regs (&d, &live_regs_mask2);
+ if (flag_pic && current_function_uses_pic_offset_table)
+ {
+ if ((live_regs_mask & (1 << PIC_OFFSET_TABLE_REGNUM)) != 0)
+ abort ();
+ live_regs_mask |= (1 << PIC_OFFSET_TABLE_REGNUM);
+ d += UNITS_PER_WORD;
+ }
+
frame_size = rounded_frame_size (d);
if (frame_pointer_needed)
@@ -4003,8 +4021,6 @@ sh_expand_epilogue ()
if (target_flags != save_flags)
emit_insn (gen_toggle_sz ());
- if (flag_pic && current_function_uses_pic_offset_table)
- live_regs_mask |= (1 << PIC_OFFSET_TABLE_REGNUM);
if (live_regs_mask & (1 << PR_REG))
pop (PR_REG);
for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)