> 2019-07-08 Eric Botcazou <ebotca...@adacore.com> > > * emit-rtl.c (set_insn_locations): New function moved from... > * function.c (set_insn_locations): ...here. > * ira-emit.c (emit_moves): Propagate location of the first instruction > to the inserted move instructions. > * reg-stack.c (compensate_edge): Set the location if the sequence is > inserted on the edge. > * rtl.h (set_insn_locations): Declare.
Jeff privately pointed out that the emit_moves change is not stable wrt debug insns so I have tested and installed the following fix, modelled on what was done for emit_to_new_bb_before. * ira-emit.c (emit_moves): Skip DEBUG_INSNs when setting the location. -- Eric Botcazou
Index: ira-emit.c =================================================================== --- ira-emit.c (revision 273247) +++ ira-emit.c (working copy) @@ -997,27 +997,30 @@ emit_moves (void) basic_block bb; edge_iterator ei; edge e; - rtx_insn *insns, *tmp; + rtx_insn *insns, *tmp, *next; FOR_EACH_BB_FN (bb, cfun) { if (at_bb_start[bb->index] != NULL) { at_bb_start[bb->index] = modify_move_list (at_bb_start[bb->index]); - insns = emit_move_list (at_bb_start[bb->index], - REG_FREQ_FROM_BB (bb)); + insns + = emit_move_list (at_bb_start[bb->index], REG_FREQ_FROM_BB (bb)); tmp = BB_HEAD (bb); if (LABEL_P (tmp)) tmp = NEXT_INSN (tmp); if (NOTE_INSN_BASIC_BLOCK_P (tmp)) tmp = NEXT_INSN (tmp); - /* Propagate the location of the current first instruction to the - moves so that they don't inherit a random location. */ - if (tmp != NULL_RTX && INSN_P (tmp)) - set_insn_locations (insns, INSN_LOCATION (tmp)); + /* Make sure to put the location of TMP or a subsequent instruction + to avoid inheriting the location of the previous instruction. */ + next = tmp; + while (next && !NONDEBUG_INSN_P (next)) + next = NEXT_INSN (next); + if (next) + set_insn_locations (insns, INSN_LOCATION (next)); if (tmp == BB_HEAD (bb)) emit_insn_before (insns, tmp); - else if (tmp != NULL_RTX) + else if (tmp) emit_insn_after (insns, PREV_INSN (tmp)); else emit_insn_after (insns, get_last_insn ());