PR rtl-optimization/16408
authorrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 1 Sep 2004 20:28:39 +0000 (20:28 +0000)
committerrakdver <rakdver@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 1 Sep 2004 20:28:39 +0000 (20:28 +0000)
* gcse.c (replace_store_insn): Fix LIBCALL/RETVAL notes.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@86928 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/gcse.c

index 220d75d..e091271 100644 (file)
@@ -1,3 +1,8 @@
+2004-09-01  Zdenek Dvorak  <rakdver@atrey.karlin.mff.cuni.cz>
+
+       PR rtl-optimization/16408
+       * gcse.c (replace_store_insn): Fix LIBCALL/RETVAL notes.
+
 2004-09-01  Richard Henderson  <rth@redhat.com>
 
         * config/ns32k/ns32k.h (TRANSFER_FROM_TRAMPOLINE): Remove.
index 16d76fe..3d97964 100644 (file)
@@ -6321,7 +6321,7 @@ remove_reachable_equiv_notes (basic_block bb, struct ls_expr *smexpr)
 static void
 replace_store_insn (rtx reg, rtx del, basic_block bb, struct ls_expr *smexpr)
 {
-  rtx insn, mem, note, set, ptr;
+  rtx insn, mem, note, set, ptr, pair;
 
   mem = smexpr->pattern;
   insn = gen_move_insn (reg, SET_SRC (single_set (del)));
@@ -6343,6 +6343,26 @@ replace_store_insn (rtx reg, rtx del, basic_block bb, struct ls_expr *smexpr)
        XEXP (ptr, 0) = insn;
        break;
       }
+
+  /* Move the notes from the deleted insn to its replacement, and patch
+     up the LIBCALL notes.  */
+  REG_NOTES (insn) = REG_NOTES (del);
+
+  note = find_reg_note (insn, REG_RETVAL, NULL_RTX);
+  if (note)
+    {
+      pair = XEXP (note, 0);
+      note = find_reg_note (pair, REG_LIBCALL, NULL_RTX);
+      XEXP (note, 0) = insn;
+    }
+  note = find_reg_note (insn, REG_LIBCALL, NULL_RTX);
+  if (note)
+    {
+      pair = XEXP (note, 0);
+      note = find_reg_note (pair, REG_RETVAL, NULL_RTX);
+      XEXP (note, 0) = insn;
+    }
+
   delete_insn (del);
 
   /* Now we must handle REG_EQUAL notes whose contents is equal to the mem;