> 2019-07-08 Eric Botcazou <[email protected]>
>
> * 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 ());