From d35dfca9e6ebe2e9990dca1c5ee4d36a79cf0604 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Thu, 30 May 2002 14:20:28 -0600 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/flow.c | 23 +++++++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b38f8e30a6f..2bc6148b635 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2002-05-30 Jeff Law + + * 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 * lcm.c (output.h): #include. diff --git a/gcc/flow.c b/gcc/flow.c index ed2b24f7180..78cd43990aa 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; } -- 2.30.2