Commit 65e9fa10 by Kazu Hirata Committed by Kazu Hirata

* cse.c (delete_trivially_dead_insn): Don't iterate.

From-SVN: r94498
parent 0530bc70
2005-01-31 Kazu Hirata <kazu@cs.umass.edu>
* cse.c (delete_trivially_dead_insn): Don't iterate.
2005-01-31 Andrew Pinski <pinskia@physics.uc.edu> 2005-01-31 Andrew Pinski <pinskia@physics.uc.edu>
* config/rs6000/rs6000.md (copysignsf3): New expand. * config/rs6000/rs6000.md (copysignsf3): New expand.
......
...@@ -7268,7 +7268,7 @@ delete_trivially_dead_insns (rtx insns, int nreg) ...@@ -7268,7 +7268,7 @@ delete_trivially_dead_insns (rtx insns, int nreg)
int *counts; int *counts;
rtx insn, prev; rtx insn, prev;
int in_libcall = 0, dead_libcall = 0; int in_libcall = 0, dead_libcall = 0;
int ndead = 0, nlastdead, niterations = 0; int ndead = 0;
timevar_push (TV_DELETE_TRIVIALLY_DEAD); timevar_push (TV_DELETE_TRIVIALLY_DEAD);
/* First count the number of times each register is used. */ /* First count the number of times each register is used. */
...@@ -7276,65 +7276,59 @@ delete_trivially_dead_insns (rtx insns, int nreg) ...@@ -7276,65 +7276,59 @@ delete_trivially_dead_insns (rtx insns, int nreg)
for (insn = next_real_insn (insns); insn; insn = next_real_insn (insn)) for (insn = next_real_insn (insns); insn; insn = next_real_insn (insn))
count_reg_usage (insn, counts, 1); count_reg_usage (insn, counts, 1);
do /* 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
nlastdead = ndead; usage counts for registers it uses.
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);
for (; insn; insn = prev) 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
int live_insn = 0; 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 prev = prev_real_insn (insn);
we can delete the whole libcall block.
Flow or loop might get confused if we did that. Remember /* Don't delete any insns that are part of a libcall block unless
that we are scanning backwards. */ we can delete the whole libcall block.
if (find_reg_note (insn, REG_RETVAL, NULL_RTX))
{ Flow or loop might get confused if we did that. Remember
in_libcall = 1; that we are scanning backwards. */
live_insn = 1; if (find_reg_note (insn, REG_RETVAL, NULL_RTX))
dead_libcall = dead_libcall_p (insn, counts); {
} in_libcall = 1;
else if (in_libcall) live_insn = 1;
live_insn = ! dead_libcall; dead_libcall = dead_libcall_p (insn, counts);
else }
live_insn = insn_live_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 /* If this is a dead insn, delete it and show registers in it aren't
being used. */ being used. */
if (! live_insn) if (! live_insn)
{ {
count_reg_usage (insn, counts, -1); count_reg_usage (insn, counts, -1);
delete_insn_and_edges (insn); delete_insn_and_edges (insn);
ndead++; ndead++;
} }
if (find_reg_note (insn, REG_LIBCALL, NULL_RTX)) if (find_reg_note (insn, REG_LIBCALL, NULL_RTX))
{ {
in_libcall = 0; in_libcall = 0;
dead_libcall = 0; dead_libcall = 0;
}
} }
} }
while (ndead != nlastdead);
if (dump_file && ndead) if (dump_file && ndead)
fprintf (dump_file, "Deleted %i trivially dead insns; %i iterations\n", fprintf (dump_file, "Deleted %i trivially dead insns\n",
ndead, niterations); ndead);
/* Clean up. */ /* Clean up. */
free (counts); free (counts);
timevar_pop (TV_DELETE_TRIVIALLY_DEAD); timevar_pop (TV_DELETE_TRIVIALLY_DEAD);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment