diff options
author | Jeff Law <law@redhat.com> | 2002-05-30 14:20:28 -0600 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2002-05-30 14:20:28 -0600 |
commit | d35dfca9e6ebe2e9990dca1c5ee4d36a79cf0604 (patch) | |
tree | d6477ccdc3c648dfc1d17513d3af2b0fa2ff2bf7 /gcc | |
parent | 81b40b72d1e15987d2a04ecead8e14de4694a5dd (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/flow.c | 23 |
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. @@ -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; } |