------- Comment #7 from steven at gcc dot gnu dot org  2007-08-16 15:05 -------
Fix for the bug:

Index: lower-subreg.c
===================================================================
--- lower-subreg.c      (revision 127558)
+++ lower-subreg.c      (working copy)
@@ -897,7 +897,7 @@ resolve_simple_move (rtx set, rtx insn)
 static bool
 resolve_clobber (rtx pat, rtx insn)
 {
-  rtx reg;
+  rtx reg, note;
   enum machine_mode orig_mode;
   unsigned int words, i;
   int ret;
@@ -909,8 +909,11 @@ resolve_clobber (rtx pat, rtx insn)
   /* If this clobber has a REG_LIBCALL note, then it is the initial
      clobber added by emit_no_conflict_block.  We were able to
      decompose the register, so we no longer need the clobber.  */
-  if (find_reg_note (insn, REG_LIBCALL, NULL_RTX) != NULL_RTX)
+  note = find_reg_note (insn, REG_LIBCALL, NULL_RTX);
+  if (note != NULL_RTX)
     {
+      rtx retval_insn = XEXP (note, 0);
+      remove_retval_note (retval_insn);
       delete_insn (insn);
       return true;
     }


In case someone cares enough to fix this properly: GCC should probably also
remove the REG_LIBCALL_ID notes of all the insns in the libcall chain -- but we
don't do that anywhere else right now and the above patch is sufficient to
avoid the ICE.


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33029

Reply via email to