diff mbox

Tweaks to RTL locus preservation code (2)

Message ID 201010240937.27907.ebotcazou@adacore.com
State New
Headers show

Commit Message

Eric Botcazou Oct. 24, 2010, 7:37 a.m. UTC
Another couple of small tweaks to the code introduced by Jakub to preserve 
location info at -O0, this time to fixup_reorder_chain.  The first change 
makes it so that the code doesn't try to split non-fallthru edges to the exit 
block (this can happen with unusual combinations of options) and the second 
one avoids creating several artificial basic blocks because of the same locus 
on different edges.

Tested (GCC + GDB) on x86_64-suse-linux, applied on the mainline.


2010-10-24  Eric Botcazou  <ebotcazou@adacore.com>

	* cfglayout.c (fixup_reorder_chain): When ensuring that there is at
	least one insn with a locus corresponding to an edge's goto_locus,
	disregard non-fallthru edges to the exit block and merge the blocks
	created for the same goto_locus.

Comments

H.J. Lu Nov. 25, 2010, 3:40 a.m. UTC | #1
On Sun, Oct 24, 2010 at 12:37 AM, Eric Botcazou <ebotcazou@adacore.com> wrote:
> Another couple of small tweaks to the code introduced by Jakub to preserve
> location info at -O0, this time to fixup_reorder_chain.  The first change
> makes it so that the code doesn't try to split non-fallthru edges to the exit
> block (this can happen with unusual combinations of options) and the second
> one avoids creating several artificial basic blocks because of the same locus
> on different edges.
>
> Tested (GCC + GDB) on x86_64-suse-linux, applied on the mainline.
>
>
> 2010-10-24  Eric Botcazou  <ebotcazou@adacore.com>
>
>        * cfglayout.c (fixup_reorder_chain): When ensuring that there is at
>        least one insn with a locus corresponding to an edge's goto_locus,
>        disregard non-fallthru edges to the exit block and merge the blocks
>        created for the same goto_locus.
>
>

This caused:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46649
diff mbox

Patch

Index: cfglayout.c
===================================================================
--- cfglayout.c	(revision 165881)
+++ cfglayout.c	(working copy)
@@ -940,7 +940,9 @@  fixup_reorder_chain (void)
         FOR_EACH_EDGE (e, ei, bb->succs)
 	  if (e->goto_locus && !(e->flags & EDGE_ABNORMAL))
 	    {
-	      basic_block nb;
+	      edge e2;
+	      edge_iterator ei2;
+	      basic_block dest, nb;
 	      rtx end;
 
 	      insn = BB_END (e->src);
@@ -957,10 +959,17 @@  fixup_reorder_chain (void)
 		  INSN_LOCATOR (BB_END (e->src)) = e->goto_locus;
 		  continue;
 		}
-	      if (e->dest != EXIT_BLOCK_PTR)
+	      dest = e->dest;
+	      if (dest == EXIT_BLOCK_PTR)
 		{
-		  insn = BB_HEAD (e->dest);
-		  end = NEXT_INSN (BB_END (e->dest));
+		  /* Non-fallthru edges to the exit block cannot be split.  */
+		  if (!(e->flags & EDGE_FALLTHRU))
+		    continue;
+		}
+	      else
+		{
+		  insn = BB_HEAD (dest);
+		  end = NEXT_INSN (BB_END (dest));
 		  while (insn != end && !NONDEBUG_INSN_P (insn))
 		    insn = NEXT_INSN (insn);
 		  if (insn != end && INSN_LOCATOR (insn)
@@ -972,6 +981,18 @@  fixup_reorder_chain (void)
 		BB_END (nb) = emit_insn_after_noloc (gen_nop (), BB_END (nb),
 						     nb);
 	      INSN_LOCATOR (BB_END (nb)) = e->goto_locus;
+
+	      /* If there are other incoming edges to the destination block
+		 with the same goto locus, redirect them to the new block as
+		 well, this can prevent other such blocks from being created
+		 in subsequent iterations of the loop.  */
+	      for (ei2 = ei_start (dest->preds); (e2 = ei_safe_edge (ei2)); )
+		if (e2->goto_locus
+		    && !(e2->flags & (EDGE_ABNORMAL | EDGE_FALLTHRU))
+		    && locator_eq (e->goto_locus, e2->goto_locus))
+		  redirect_edge_and_branch (e2, nb);
+		else
+		  ei_next (&ei2);
 	    }
       }
 }