aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJohn Wehle <john@feith.com>2001-10-11 03:51:24 +0000
committerJohn Wehle <wehle@gcc.gnu.org>2001-10-11 03:51:24 +0000
commiteb9d8e4d0ba0b89881d024c23ca5866bbc359409 (patch)
tree57d914a811598a624f337dd3ee4f78fbb3d988ff /gcc
parentb36948478c22c58018d0a888ee8ca393dea60dc9 (diff)
downloadgcc-eb9d8e4d0ba0b89881d024c23ca5866bbc359409.zip
gcc-eb9d8e4d0ba0b89881d024c23ca5866bbc359409.tar.gz
gcc-eb9d8e4d0ba0b89881d024c23ca5866bbc359409.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/flow.c21
-rw-r--r--gcc/rtlanal.c5
3 files changed, 30 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 536a351..1b06df2 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 <shebs@apple.com>
* alias.c: Remove uses of "register" specifier in declarations
diff --git a/gcc/flow.c b/gcc/flow.c
index f0dd62e..030a233 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 ee40d6c..9cf879c 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;