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