------- Comment #7 from dave at hiauly1 dot hia dot nrc dot ca 2005-11-27 17:51 ------- Subject: Re: [4.2 Regression] libgcov.c:652: ICE: in default_secondary_reload, at targhooks.c:529
This is what I see in gdb: Assembling functions: __gcov_merge_single Breakpoint 3, default_secondary_reload (in_p=0 '\0', x=0x4000d720, reload_class=FP_REGS, reload_mode=DImode, sri=0xbff5ed10) at ../../gcc/gcc/targhooks.c:534 534 gcc_assert (scratch_class == class); (gdb) p class $1 = GENERAL_REGS (gdb) p scratch_class $2 = GENERAL_REGS (gdb) p insn_data[(int) icode] $3 = {name = 0x864b60 "reload_outdi", output = {single = 0x0, multi = 0x0, function = 0}, genfun = @0x8dfda2: 0x8e117c <fixup_branch_offset+15508>, operand = 0x862bc4, n_operands = 3 '\003', n_dups = 0 '\0', n_alternatives = 1 '\001', output_format = 0 '\0'} (gdb) p debug_rtx (x) (mem:DI (reg/f:SI 30 %r30) [0 S8 A64]) $4 = void (gdb) p reload_class $5 = FP_REGS (gdb) p reload_mode $6 = DImode The problem is that the class for the scratch register specified in "reload_outdi" is GENERAL_REGS but we actually need R1_REGS for certain reloads. The documentation indicates that reload_in* and reload_out* have been obsoleted by the new target hook. If that's really the case, then it would appear emit_move_sequence needs a rewrite to somehow integrate it with the new target hook. Dave -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25027