[patch] PR20648

Steven Bosscher stevenb@suse.de
Sun Apr 3 00:14:00 GMT 2005


On Wednesday 30 March 2005 22:51, Steven Bosscher wrote:
> On Wednesday 30 March 2005 22:16, Richard Henderson wrote:
> > On Tue, Mar 29, 2005 at 03:20:37PM +0200, Steven Bosscher wrote:
> > > +      if (computed_jump_p (BB_END (bb))
> > > +	  && !(EDGE_PRED (bb, 0)->flags & EDGE_ABNORMAL)
> > > +	  && (single_pred_p (bb)
> > > +	      || !(EDGE_PRED (bb, 1)->flags & EDGE_ABNORMAL)))
> >
> > I'd prefer that you check all incoming edges, not just two.
>
> I think I even have to.  I was apparently thinking about succ
> edges when I wrote this.

This is the updated patch, which I've bootstrapped and tested on
{i686,ppc}-suse-linux-gnu.  OK?

Gr.
Steven

        PR middle-end/20648
        * bb-reorder.c (duplicate_computed_gotos): Do not unfactor
        a computed goto if the edge to the computed goto block has
        incoming abnormal edges.  Clarify how the function works.

Index: bb-reorder.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/bb-reorder.c,v
retrieving revision 1.97
diff -u -3 -p -r1.97 bb-reorder.c
--- bb-reorder.c	1 Apr 2005 14:36:31 -0000	1.97
+++ bb-reorder.c	2 Apr 2005 10:47:57 -0000
@@ -2013,33 +2013,49 @@ duplicate_computed_gotos (void)
   max_size = uncond_jump_length * PARAM_VALUE (PARAM_MAX_GOTO_DUPLICATION_INSNS);
   candidates = BITMAP_ALLOC (NULL);
 
-  /* Build the reorder chain for the original order of blocks.
-     Look for a computed jump while we are at it.  */
+  /* Look for blocks that end in a computed jump, and see if such blocks
+     are suitable for unfactoring.  If a block is a candidate for unfactoring,
+     mark it in the candidates.  */
   FOR_EACH_BB (bb)
     {
+      rtx insn;
+      edge e;
+      edge_iterator ei;
+      int size, all_flags;
+
+      /* Build the reorder chain for the original order of blocks.  */
       if (bb->next_bb != EXIT_BLOCK_PTR)
 	bb->rbi->next = bb->next_bb;
 
-      /* If the block ends in a computed jump and it is small enough,
-	 make it a candidate for duplication.  */
-      if (computed_jump_p (BB_END (bb))
-	  && !find_reg_note (BB_END (bb), REG_CROSSING_JUMP, NULL_RTX))
-	{
-	  rtx insn;
-	  int size = 0;
-
-	  FOR_BB_INSNS (bb, insn)
-	    if (INSN_P (insn))
-	      {
-		size += get_attr_length (insn);
-		if (size > max_size)
-		  break;
-	      }
-
-	  if (size <= max_size
-	      && can_duplicate_block_p (bb))
-	    bitmap_set_bit (candidates, bb->index);
-	}
+      /* Obviously the block has to end in a computed jump.  */
+      if (!computed_jump_p (BB_END (bb)))
+	continue;
+
+      /* Only consider blocks that can be duplicated.  */
+      if (find_reg_note (BB_END (bb), REG_CROSSING_JUMP, NULL_RTX)
+	  || !can_duplicate_block_p (bb))
+	continue;
+
+      /* Make sure that the block is small enough.  */
+      size = 0;
+      FOR_BB_INSNS (bb, insn)
+	if (INSN_P (insn))
+	  {
+	    size += get_attr_length (insn);
+	    if (size > max_size)
+	       break;
+	  }
+      if (size > max_size)
+	continue;
+
+      /* Final check: there must not be any incoming abnormal edges.  */
+      all_flags = 0;
+      FOR_EACH_EDGE (e, ei, bb->preds)
+	all_flags |= e->flags;
+      if (all_flags & EDGE_COMPLEX)
+	continue;
+
+      bitmap_set_bit (candidates, bb->index);
     }
 
   /* Nothing to do if there is no computed jump here.  */



More information about the Gcc-patches mailing list