aboutsummaryrefslogtreecommitdiff
path: root/gcc/cse.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/cse.c')
-rw-r--r--gcc/cse.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/gcc/cse.c b/gcc/cse.c
index c15c63ff..c292c52 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -691,7 +691,7 @@ static int check_dependence PARAMS ((rtx *, void *));
static void flush_hash_table PARAMS ((void));
static bool insn_live_p PARAMS ((rtx, int *));
static bool set_live_p PARAMS ((rtx, rtx, int *));
-static bool dead_libcall_p PARAMS ((rtx));
+static bool dead_libcall_p PARAMS ((rtx, int *));
/* Dump the expressions in the equivalence class indicated by CLASSP.
This function is used only for debugging. */
@@ -7571,8 +7571,9 @@ insn_live_p (insn, counts)
/* Return true if libcall is dead as a whole. */
static bool
-dead_libcall_p (insn)
+dead_libcall_p (insn, counts)
rtx insn;
+ int *counts;
{
rtx note;
/* See if there's a REG_EQUAL note on this insn and try to
@@ -7589,11 +7590,17 @@ dead_libcall_p (insn)
if (!new)
new = XEXP (note, 0);
+ /* While changing insn, we must update the counts accordingly. */
+ count_reg_usage (insn, counts, NULL_RTX, -1);
+
if (set && validate_change (insn, &SET_SRC (set), new, 0))
{
+ count_reg_usage (insn, counts, NULL_RTX, 1);
remove_note (insn, find_reg_note (insn, REG_RETVAL, NULL_RTX));
+ remove_note (insn, note);
return true;
}
+ count_reg_usage (insn, counts, NULL_RTX, 1);
}
return false;
}
@@ -7652,7 +7659,7 @@ delete_trivially_dead_insns (insns, nreg)
{
in_libcall = 1;
live_insn = 1;
- dead_libcall = dead_libcall_p (insn);
+ dead_libcall = dead_libcall_p (insn, counts);
}
else if (in_libcall)
live_insn = ! dead_libcall;