diff mbox

fix up hot/cold partitioning on ports that don't have long conditional branches

Message ID 0DF7E8C3-0E32-45F7-AA64-3551505A061A@comcast.net
State New
Headers show

Commit Message

Mike Stump April 22, 2011, 1:30 a.m. UTC
This patch fixes up hot/cold partitioning on ports that don't have long conditional branches.  I'll note that the entire file has lots of other jump optimizations that are suspect.

Ok?
2011-04-21  Mike Stump  <mikestump@comcast.net>

	* reorg.c (relax_delay_slots): Don't delete a jump that crosses a
	section boundary.
	(follow_jumps): Don't replace a short conditional jump with a
	long conditional jump when the port doesn't have long
	conditional jumps.
	(fill_slots_from_thread): Pass insn to follow_jumps.
	(relax_delay_slots): Likewise.

Comments

Eric Botcazou April 22, 2011, 10:28 a.m. UTC | #1
> This patch fixes up hot/cold partitioning on ports that don't have long
> conditional branches.  I'll note that the entire file has lots of other
> jump optimizations that are suspect.

Do you have a testcase for one of the ports in the tree?  Note that parameters 
of function must be documented in the head comment.  The patch contains long 
lines.  The ChangeLog entry doesn't look correct (relax_delay_slots mentioned 
twice, no mention of the new parameter of follow_jumps, etc).  How was the 
patch tested?  Please generate patches with diff -p.
diff mbox

Patch

Index: reorg.c
===================================================================
--- reorg.c	(revision 1301)
+++ reorg.c	(working copy)
@@ -2509,7 +2509,7 @@ 
    since that tells caller to avoid changing the insn.  */
 
 static rtx
-follow_jumps (rtx label)
+follow_jumps (rtx label, rtx jump)
 {
   rtx insn;
   rtx next;
@@ -2529,6 +2529,16 @@ 
     {
       rtx tem;
 
+      /* If a label crosses a section boundary and we're thinking
+	 about changing a conditional jump to be a conditional jump
+	 across that boundary, don't do it if the port doesn't have
+	 long conditional branches.  We can however jump to the label
+	 just before we cross such a boundary.  */
+      if (!HAS_LONG_COND_BRANCH
+	  && find_reg_note (insn, REG_CROSSING_JUMP, NULL_RTX)
+	  && (condjump_p (jump) || condjump_in_parallel_p (jump)))
+	return value;
+
       /* If we have found a cycle, make the insn jump to itself.  */
       if (JUMP_LABEL (insn) == label)
 	return label;
@@ -2991,7 +3001,7 @@ 
 	  && redirect_with_delay_list_safe_p (insn,
 					      JUMP_LABEL (new_thread),
 					      delay_list))
-	new_thread = follow_jumps (JUMP_LABEL (new_thread));
+	new_thread = follow_jumps (JUMP_LABEL (new_thread), new_thread);
 
       if (new_thread == 0)
 	label = find_end_label ();
@@ -3342,12 +3352,13 @@ 
 	  && (condjump_p (insn) || condjump_in_parallel_p (insn))
 	  && (target_label = JUMP_LABEL (insn)) != 0)
 	{
-	  target_label = skip_consecutive_labels (follow_jumps (target_label));
+	  target_label = skip_consecutive_labels (follow_jumps (target_label, insn));
 	  if (target_label == 0)
 	    target_label = find_end_label ();
 
 	  if (target_label && next_active_insn (target_label) == next
-	      && ! condjump_in_parallel_p (insn))
+	      && ! condjump_in_parallel_p (insn)
+	      && find_reg_note (insn, REG_CROSSING_JUMP, NULL_RTX) == NULL_RTX)
 	    {
 	      delete_jump (insn);
 	      continue;
@@ -3492,7 +3503,7 @@ 
 	{
 	  /* If this jump goes to another unconditional jump, thread it, but
 	     don't convert a jump into a RETURN here.  */
-	  trial = skip_consecutive_labels (follow_jumps (target_label));
+	  trial = skip_consecutive_labels (follow_jumps (target_label, delay_insn));
 	  if (trial == 0)
 	    trial = find_end_label ();