http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56957
Steven Bosscher <steven at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|ASSIGNED |NEW CC| |abel at gcc dot gnu.org AssignedTo|steven at gcc dot gnu.org |unassigned at gcc dot | |gnu.org --- Comment #2 from Steven Bosscher <steven at gcc dot gnu.org> 2013-04-16 20:54:17 UTC --- Breakpoint 5, sel_remove_insn (insn=0x3fffb5da4e78, only_disconnect=false, full_tidying=false) at ../../trunk/gcc/sel-sched-ir.c:3938 3938 delete_insn (insn); 1: debug_rtx(insn) = (insn 303 190 191 10 (set (reg:DF 165 f37 [421]) (unspec:DF [ (mem:DF (reg/f:DI 18 r18 [420]) [2 *a_7(D) S8 A64]) ] UNSPEC_LDA)) 13 {movdf_advanced} (nil)) void (gdb) up #1 0x0000000010843984 in remove_insn_from_stream (insn=0x3fffb5da4e78, only_disconnect=false) at ../../trunk/gcc/sel-sched.c:6042 6042 sel_remove_insn (insn, only_disconnect, false); (gdb) up #2 0x0000000010843af0 in move_op_orig_expr_found (insn=0x3fffb5da4e78, expr=0x115f9fd8, lparams=0x3fffffffda78, static_params=0x3fffffffdaa8) at ../../trunk/gcc/sel-sched.c:6066 6066 remove_insn_from_stream (insn, only_disconnect); gdb) p only_disconnect $19 = false (gdb) l 6060 6055 moveop_static_params_p params = (moveop_static_params_p) static_params; 6056 6057 copy_expr_onside (params->c_expr, INSN_EXPR (insn)); 6058 track_scheduled_insns_and_blocks (insn); 6059 insn_emitted = handle_emitting_transformations (insn, expr, params); 6060 only_disconnect = (params->uid == INSN_UID (insn) 6061 && ! insn_emitted && ! EXPR_WAS_CHANGED (expr)); 6062 6063 /* Mark that we've disconnected an insn. */ 6064 if (only_disconnect) (gdb) p params->uid $20 = 303 (gdb) p insn_emitted $21 = false (gdb) p EXPR_WAS_CHANGED(expr) $22 = true No idea what to make of this. sel-sched deliberately chooses to discard the insn instead of only disconnecting it, but it re-emits the insn later anyway. That's wrong. CC sel-sched guru.