]> gcc.gnu.org Git - gcc.git/commitdiff
re PR rtl-optimization/16408 (internal compiler error: in delete_insn, at cfgrtl...
authorZdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
Wed, 1 Sep 2004 20:28:39 +0000 (22:28 +0200)
committerZdenek Dvorak <rakdver@gcc.gnu.org>
Wed, 1 Sep 2004 20:28:39 +0000 (20:28 +0000)
PR rtl-optimization/16408
* gcse.c (replace_store_insn): Fix LIBCALL/RETVAL notes.

From-SVN: r86928

gcc/ChangeLog
gcc/gcse.c

index 220d75d89bad2ba1033a8fef859ac44a048dd883..e091271367541b082d7e84f9b33c10d21139d633 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 16d76fe4d6c760cc9cfe9d9c7735f893ba347d43..3d97964067e975001687f5297f41e0c8f1197c09 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;
This page took 0.075139 seconds and 5 git commands to generate.