> 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 ());

Reply via email to