From cda94cbba16f7754f7ce2e74a74af71f83722ff2 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 10 Jan 2002 18:44:48 -0800 Subject: [PATCH] cfgrtl.c (delete_insn): Assert insn hasn't been deleted yet. * cfgrtl.c (delete_insn): Assert insn hasn't been deleted yet. * reload1.c (delete_output_reload): Zap spill_reg_store. Take care not to delete instructions twice. From-SVN: r48760 --- gcc/ChangeLog | 14 ++++++++++---- gcc/cfgrtl.c | 3 +++ gcc/reload1.c | 52 +++++++++++++++++++++++++++------------------------ 3 files changed, 41 insertions(+), 28 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d6061ff77ab..5c67d6dc58d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2002-01-10 Richard Henderson + + * cfgrtl.c (delete_insn): Assert insn hasn't been deleted yet. + * reload1.c (delete_output_reload): Zap spill_reg_store. Take + care not to delete instructions twice. + 2002-01-10 Zack Weinberg * toplev.c: Don't declare environ (it's not used anywhere). @@ -154,7 +160,7 @@ Thu Jan 10 22:35:54 CET 2002 Jan Hubicka Thu Jan 10 17:19:12 CET 2002 Jan Hubicka * cfgcleanup.c (try_forward_edges): Properly initialize nthreaded_edges; - update edge probabilities to match. + update edge probabilities to match. 2002-01-10 Joseph S. Myers @@ -187,7 +193,7 @@ Thu Jan 10 11:19:18 CET 2002 Jan Hubicka 2002-01-20 Graham Stott * dwarf2out.c (indirect_string_alloc, output_indirect_string): - Move prototype into DWARF2_DEBUGGING_INFO conditional block. + Move prototype into DWARF2_DEBUGGING_INFO conditional block. 2002-01-10 Richard Henderson @@ -287,8 +293,8 @@ Thu Jan 10 11:19:18 CET 2002 Jan Hubicka 2002-01-09 Herman A.J. ten Brugge - * real.c (c4xtoe, toc4x): Do some special conversion on long doubles - for the c4x target. Also improve layout. + * real.c (c4xtoe, toc4x): Do some special conversion on long doubles + for the c4x target. Also improve layout. 2002-01-09 Richard Henderson diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index a4f25f8964c..f3187989add 100644 --- a/gcc/cfgrtl.c +++ b/gcc/cfgrtl.c @@ -135,6 +135,9 @@ delete_insn (insn) if (really_delete) { + /* If this insn has already been deleted, something is very wrong. */ + if (INSN_DELETED_P (insn)) + abort (); remove_insn (insn); INSN_DELETED_P (insn) = 1; } diff --git a/gcc/reload1.c b/gcc/reload1.c index 58449c0f3ff..22d3b3d0d9a 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -7537,9 +7537,8 @@ gen_reload (out, in, opnum, type) return last ? NEXT_INSN (last) : get_insns (); } -/* Delete a previously made output-reload - whose result we now believe is not needed. - First we double-check. +/* Delete a previously made output-reload whose result we now believe + is not needed. First we double-check. INSN is the insn now being processed. LAST_RELOAD_REG is the hard register number for which we want to delete @@ -7633,15 +7632,21 @@ delete_output_reload (insn, j, last_reload_reg) } } + /* We will be deleting the insn. Remove the spill reg information. */ + for (k = HARD_REGNO_NREGS (last_reload_reg, GET_MODE (reg)); k-- > 0; ) + { + spill_reg_store[last_reload_reg + k] = 0; + spill_reg_stored_to[last_reload_reg + k] = 0; + } + /* The caller has already checked that REG dies or is set in INSN. - It has also checked that we are optimizing, and thus some inaccurancies - in the debugging information are acceptable. - So we could just delete output_reload_insn. - But in some cases we can improve the debugging information without - sacrificing optimization - maybe even improving the code: - See if the pseudo reg has been completely replaced - with reload regs. If so, delete the store insn - and forget we had a stack slot for the pseudo. */ + It has also checked that we are optimizing, and thus some + inaccurancies in the debugging information are acceptable. + So we could just delete output_reload_insn. But in some cases + we can improve the debugging information without sacrificing + optimization - maybe even improving the code: See if the pseudo + reg has been completely replaced with reload regs. If so, delete + the store insn and forget we had a stack slot for the pseudo. */ if (rld[j].out != rld[j].in && REG_N_DEATHS (REGNO (reg)) == 1 && REG_N_SETS (REGNO (reg)) == 1 @@ -7650,11 +7655,10 @@ delete_output_reload (insn, j, last_reload_reg) { rtx i2; - /* We know that it was used only between here - and the beginning of the current basic block. - (We also know that the last use before INSN was - the output reload we are thinking of deleting, but never mind that.) - Search that range; see if any ref remains. */ + /* We know that it was used only between here and the beginning of + the current basic block. (We also know that the last use before + INSN was the output reload we are thinking of deleting, but never + mind that.) Search that range; see if any ref remains. */ for (i2 = PREV_INSN (insn); i2; i2 = PREV_INSN (i2)) { rtx set = single_set (i2); @@ -7677,7 +7681,8 @@ delete_output_reload (insn, j, last_reload_reg) } } - /* Delete the now-dead stores into this pseudo. */ + /* Delete the now-dead stores into this pseudo. Note that this + loop also takes care of deleting output_reload_insn. */ for (i2 = PREV_INSN (insn); i2; i2 = PREV_INSN (i2)) { rtx set = single_set (i2); @@ -7685,8 +7690,6 @@ delete_output_reload (insn, j, last_reload_reg) if (set != 0 && SET_DEST (set) == reg) { delete_address_reloads (i2, insn); - /* This might be a basic block head, - thus don't use delete_insn. */ delete_insn (i2); } if (GET_CODE (i2) == CODE_LABEL @@ -7694,14 +7697,15 @@ delete_output_reload (insn, j, last_reload_reg) break; } - /* For the debugging info, - say the pseudo lives in this reload reg. */ + /* For the debugging info, say the pseudo lives in this reload reg. */ reg_renumber[REGNO (reg)] = REGNO (rld[j].reg_rtx); alter_reg (REGNO (reg), -1); } - delete_address_reloads (output_reload_insn, insn); - delete_insn (output_reload_insn); - + else + { + delete_address_reloads (output_reload_insn, insn); + delete_insn (output_reload_insn); + } } /* We are going to delete DEAD_INSN. Recursively delete loads of -- 2.30.2