From eb9d8e4d0ba0b89881d024c23ca5866bbc359409 Mon Sep 17 00:00:00 2001 From: John Wehle Date: Thu, 11 Oct 2001 03:51:24 +0000 Subject: [PATCH] rtlanal.c (noop_move_p): Insns with a REG_RETVAL note should not be considered as a no-op. * rtlanal.c (noop_move_p): Insns with a REG_RETVAL note should not be considered as a no-op. * flow.c (delete_noop_moves): Handle REG_LIBCALL notes. From-SVN: r46174 --- gcc/ChangeLog | 6 ++++++ gcc/flow.c | 21 +++++++++++++++++++-- gcc/rtlanal.c | 5 +++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 536a3517e86f..1b06df2be1d3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +Wed Oct 10 23:49:06 EDT 2001 John Wehle (john@feith.com) + + * rtlanal.c (noop_move_p): Insns with a REG_RETVAL note + should not be considered as a no-op. + * flow.c (delete_noop_moves): Handle REG_LIBCALL notes. + 2001-10-10 Stan Shebs * alias.c: Remove uses of "register" specifier in declarations diff --git a/gcc/flow.c b/gcc/flow.c index f0dd62e31498..030a23370521 100644 --- a/gcc/flow.c +++ b/gcc/flow.c @@ -771,8 +771,25 @@ delete_noop_moves (f) next = NEXT_INSN (insn); if (INSN_P (insn) && noop_move_p (insn)) { - /* Do not call delete_insn here to not confuse backward - pointers of LIBCALL block. */ + rtx note; + + /* If we're about to remove the first insn of a libcall + then move the libcall note to the next real insn and + update the retval note. */ + if ((note = find_reg_note (insn, REG_LIBCALL, NULL_RTX)) + && XEXP (note, 0) != insn) + { + rtx new_libcall_insn = next_real_insn (insn); + rtx retval_note = find_reg_note (XEXP (note, 0), + REG_RETVAL, NULL_RTX); + REG_NOTES (new_libcall_insn) + = gen_rtx_INSN_LIST (REG_LIBCALL, XEXP (note, 0), + REG_NOTES (new_libcall_insn)); + XEXP (retval_note, 0) = new_libcall_insn; + } + + /* Do not call delete_insn here since that may change + the basic block boundaries which upsets some callers. */ PUT_CODE (insn, NOTE); NOTE_LINE_NUMBER (insn) = NOTE_INSN_DELETED; NOTE_SOURCE_FILE (insn) = 0; diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index ee40d6c79083..9cf879c13778 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -1037,6 +1037,11 @@ noop_move_p (insn) if (find_reg_note (insn, REG_EQUAL, NULL_RTX)) return 0; + /* For now treat an insn with a REG_RETVAL note as a + a special insn which should not be considered a no-op. */ + if (find_reg_note (insn, REG_RETVAL, NULL_RTX)) + return 0; + if (GET_CODE (pat) == SET && set_noop_p (pat)) return 1; -- 2.43.5