From: Kazu Hirata Date: Mon, 31 Jan 2005 22:43:36 +0000 (+0000) Subject: * cse.c (delete_trivially_dead_insn): Don't iterate. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=65e9fa1009c4d715363af095e40d954293644315;p=gcc.git * cse.c (delete_trivially_dead_insn): Don't iterate. From-SVN: r94498 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8d618f5a943..4fa04ff95c2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2005-01-31 Kazu Hirata + + * cse.c (delete_trivially_dead_insn): Don't iterate. + 2005-01-31 Andrew Pinski * config/rs6000/rs6000.md (copysignsf3): New expand. diff --git a/gcc/cse.c b/gcc/cse.c index 427ab0b6ef0..ca0bade1467 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -7268,7 +7268,7 @@ delete_trivially_dead_insns (rtx insns, int nreg) int *counts; rtx insn, prev; int in_libcall = 0, dead_libcall = 0; - int ndead = 0, nlastdead, niterations = 0; + int ndead = 0; timevar_push (TV_DELETE_TRIVIALLY_DEAD); /* First count the number of times each register is used. */ @@ -7276,65 +7276,59 @@ delete_trivially_dead_insns (rtx insns, int nreg) for (insn = next_real_insn (insns); insn; insn = next_real_insn (insn)) count_reg_usage (insn, counts, 1); - do - { - nlastdead = ndead; - niterations++; - /* Go from the last insn to the first and delete insns that only set unused - registers or copy a register to itself. As we delete an insn, remove - usage counts for registers it uses. - - The first jump optimization pass may leave a real insn as the last - insn in the function. We must not skip that insn or we may end - up deleting code that is not really dead. */ - insn = get_last_insn (); - if (! INSN_P (insn)) - insn = prev_real_insn (insn); + /* Go from the last insn to the first and delete insns that only set unused + registers or copy a register to itself. As we delete an insn, remove + usage counts for registers it uses. - for (; insn; insn = prev) - { - int live_insn = 0; + The first jump optimization pass may leave a real insn as the last + insn in the function. We must not skip that insn or we may end + up deleting code that is not really dead. */ + insn = get_last_insn (); + if (! INSN_P (insn)) + insn = prev_real_insn (insn); - prev = prev_real_insn (insn); + for (; insn; insn = prev) + { + int live_insn = 0; - /* Don't delete any insns that are part of a libcall block unless - we can delete the whole libcall block. + prev = prev_real_insn (insn); - Flow or loop might get confused if we did that. Remember - that we are scanning backwards. */ - if (find_reg_note (insn, REG_RETVAL, NULL_RTX)) - { - in_libcall = 1; - live_insn = 1; - dead_libcall = dead_libcall_p (insn, counts); - } - else if (in_libcall) - live_insn = ! dead_libcall; - else - live_insn = insn_live_p (insn, counts); + /* Don't delete any insns that are part of a libcall block unless + we can delete the whole libcall block. + + Flow or loop might get confused if we did that. Remember + that we are scanning backwards. */ + if (find_reg_note (insn, REG_RETVAL, NULL_RTX)) + { + in_libcall = 1; + live_insn = 1; + dead_libcall = dead_libcall_p (insn, counts); + } + else if (in_libcall) + live_insn = ! dead_libcall; + else + live_insn = insn_live_p (insn, counts); - /* If this is a dead insn, delete it and show registers in it aren't - being used. */ + /* If this is a dead insn, delete it and show registers in it aren't + being used. */ - if (! live_insn) - { - count_reg_usage (insn, counts, -1); - delete_insn_and_edges (insn); - ndead++; - } + if (! live_insn) + { + count_reg_usage (insn, counts, -1); + delete_insn_and_edges (insn); + ndead++; + } - if (find_reg_note (insn, REG_LIBCALL, NULL_RTX)) - { - in_libcall = 0; - dead_libcall = 0; - } + if (find_reg_note (insn, REG_LIBCALL, NULL_RTX)) + { + in_libcall = 0; + dead_libcall = 0; } } - while (ndead != nlastdead); if (dump_file && ndead) - fprintf (dump_file, "Deleted %i trivially dead insns; %i iterations\n", - ndead, niterations); + fprintf (dump_file, "Deleted %i trivially dead insns\n", + ndead); /* Clean up. */ free (counts); timevar_pop (TV_DELETE_TRIVIALLY_DEAD);