diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8363fbc350fc..bd61b8ee3445 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 0aeb764ef948..ffa25095eb43 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);