aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2002-05-30 14:20:28 -0600
committerJeff Law <law@gcc.gnu.org>2002-05-30 14:20:28 -0600
commitd35dfca9e6ebe2e9990dca1c5ee4d36a79cf0604 (patch)
treed6477ccdc3c648dfc1d17513d3af2b0fa2ff2bf7 /gcc
parent81b40b72d1e15987d2a04ecead8e14de4694a5dd (diff)
downloadgcc-d35dfca9e6ebe2e9990dca1c5ee4d36a79cf0604.zip
gcc-d35dfca9e6ebe2e9990dca1c5ee4d36a79cf0604.tar.gz
gcc-d35dfca9e6ebe2e9990dca1c5ee4d36a79cf0604.tar.bz2
flow.c (propagate_one_insn): Revise yesterday's patch.
* flow.c (propagate_one_insn): Revise yesterday's patch. Delete a dead insn with a REG_RETVAL note when the entire libcall is not dead and remove the associated REG_LIBCALL note at the same time. From-SVN: r54065
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/flow.c23
2 files changed, 27 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b38f8e3..2bc6148 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2002-05-30 Jeff Law <law@redhat.com>
+
+ * flow.c (propagate_one_insn): Revise yesterday's patch. Delete
+ a dead insn with a REG_RETVAL note when the entire libcall is not
+ dead and remove the associated REG_LIBCALL note at the same time.
+
Thu May 30 19:54:30 2002 J"orn Rennecke <joern.rennecke@superh.com>
* lcm.c (output.h): #include.
diff --git a/gcc/flow.c b/gcc/flow.c
index ed2b24f..78cd439 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -1643,8 +1643,27 @@ propagate_one_insn (pbi, insn)
if (libcall_is_dead)
prev = propagate_block_delete_libcall ( insn, note);
- else if (!note)
- propagate_block_delete_insn (insn);
+ else
+ {
+
+ if (note)
+ {
+ /* If INSN contains a RETVAL note and is dead, but the libcall
+ as a whole is not dead, then we want to remove INSN, but
+ not the whole libcall sequence.
+
+ However, we need to also remove the dangling REG_LIBCALL
+ note so that we do not have mis-matched LIBCALL/RETVAL
+ notes. In theory we could find a new location for the
+ REG_RETVAL note, but it hardly seems worth the effort. */
+ rtx libcall_note;
+
+ libcall_note
+ = find_reg_note (XEXP (note, 0), REG_LIBCALL, NULL_RTX);
+ remove_note (XEXP (note, 0), libcall_note);
+ }
+ propagate_block_delete_insn (insn);
+ }
return prev;
}