------- 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