From eb996a4ac9d4abe017e094872f638ecee872c2cb Mon Sep 17 00:00:00 2001 From: Kaz Kojima Date: Sat, 28 Apr 2007 00:07:40 +0000 Subject: [PATCH] re PR target/31701 (SH: wrong epilogue for sibling calls) PR target/31701 * config/sh/sh.c (output_stack_adjust): Avoid using the frame register itself to hold the offset constant. Tell flow the use of r4 and r5 when they are used. From-SVN: r124248 --- gcc/ChangeLog | 7 +++++++ gcc/config/sh/sh.c | 11 ++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8363fbc350f..bd61b8ee344 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-04-27 Kaz Kojima + + PR target/31701 + * config/sh/sh.c (output_stack_adjust): Avoid using the frame + register itself to hold the offset constant. Tell flow the use + of r4 and r5 when they are used. + 2007-04-27 Richard Guenther * tree-ssa-forwprop.c (forward_propagate_into_cond): Keep track diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index 0aeb764ef94..ffa25095eb4 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -5619,7 +5619,13 @@ output_stack_adjust (int size, rtx reg, int epilogue_p, temp = scavenge_reg (&temps); } if (temp < 0 && live_regs_mask) - temp = scavenge_reg (live_regs_mask); + { + HARD_REG_SET temps; + + COPY_HARD_REG_SET (temps, *live_regs_mask); + CLEAR_HARD_REG_BIT (temps, REGNO (reg)); + temp = scavenge_reg (&temps); + } if (temp < 0) { rtx adj_reg, tmp_reg, mem; @@ -5668,6 +5674,9 @@ output_stack_adjust (int size, rtx reg, int epilogue_p, emit_move_insn (adj_reg, mem); mem = gen_tmp_stack_mem (Pmode, gen_rtx_POST_INC (Pmode, reg)); emit_move_insn (tmp_reg, mem); + /* Tell flow the insns that pop r4/r5 aren't dead. */ + emit_insn (gen_rtx_USE (VOIDmode, tmp_reg)); + emit_insn (gen_rtx_USE (VOIDmode, adj_reg)); return; } const_reg = gen_rtx_REG (GET_MODE (reg), temp); -- 2.30.2