http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46171
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> 2010-10-27 02:51:32 UTC --- So we have RTL like: (insn 6 3 7 2 (set (reg:SF 21 xmm0) (reg/v:SF 61 [ f ])) pr46171.c:7 110 {*movsf_internal} (nil)) (call_insn 7 6 17 2 (set (reg:SF 21 xmm0) (call (mem:QI (symbol_ref:DI ("barf") [flags 0x41] <function_decl 0x7ffff16d1000 barf>) [0 S1 A8]) (const_int 0 [0]))) pr46171.c:7 883 {*call_value_0_rex64} (nil) (expr_list:REG_DEP_TRUE (use (reg:SF 21 xmm0)) (nil))) (debug_insn 17 7 9 2 (var_location:SF D#2 (reg:SF 21 xmm0)) -1 (nil)) (debug_insn 9 17 10 2 (var_location:SF f (debug_expr:SF D#2)) pr46171.c:7 -1 (nil)) (insn 10 9 11 2 (set (reg:QI 0 ax) (const_int 0 [0])) pr46171.c:8 66 {*movqi_internal} (nil)) (call_insn 11 10 16 2 (set (reg:DF 21 xmm0) (call (mem:QI (symbol_ref:DI ("bard") [flags 0x41] <function_decl 0x7ffff16b2f00 bard>) [0 S1 A8]) (const_int 0 [0]))) pr46171.c:8 883 {*call_value_0_rex64} (expr_list:REG_UNUSED (reg:DF 21 xmm0) (nil)) (expr_list:REG_DEP_TRUE (use (reg:QI 0 ax)) (nil))) (debug_insn 16 11 13 2 (var_location:DF D#1 (reg:DF 21 xmm0)) -1 (nil)) (debug_insn 13 16 0 2 (var_location:DF d (debug_expr:DF D#1)) pr46171.c:8 -1 (nil)) debug insn 16 adds DFmode use of xmm0 via dead_debug_add. Then the call_insn before it isn't called for reg 21, as there are no uses of it, just sets. Then another dead_debug_add is called for register 21 on insn 17, this time in SFmode and then finally a dead_debug_insert_before is called on the first call insn because reg 21 is also used there, not just set. As we have both SFmode and DFmode in dead debug structures for reg 21, it tries to create a SFmode SUBREG of the DFmode DEBUG_EXPR and ICEs.