This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

fix Xtensa relaxation at ends of loops


Apparently the Xtensa updates that I merged in recently included some new optimizations that are not always safe. This patch temporarily reverts the behavior of relaxations at the ends of loops to skip those optimizations. I plan to revisit this later.

Tested by running the GAS testsuite with an xtensa-elf target. Committed on the mainline.

--Bob

2004-11-10 Bob Wilson <bob.wilson@acm.org>

        * config/tc-xtensa.c (update_next_frag_state): Always add a NOP if
        relaxing at the end of a loop.  Don't mark frags as UNREACHABLE or
        MAYBE_UNREACHABLE.
        (relax_frag_immed): Update call to update_next_frag_state.

Index: tc-xtensa.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-xtensa.c,v
retrieving revision 1.15
diff -u -p -r1.15 tc-xtensa.c
--- tc-xtensa.c	5 Nov 2004 17:25:34 -0000	1.15
+++ tc-xtensa.c	10 Nov 2004 21:04:01 -0000
@@ -4535,7 +4535,7 @@ next_frag_format_size (const fragS *frag
    switch its state so it will instantiate a NOP.  */
 
 static void
-update_next_frag_state (fragS *fragP, bfd_boolean unreachable)
+update_next_frag_state (fragS *fragP)
 {
   fragS *next_fragP = fragP->fr_next;
   fragS *new_target = NULL;
@@ -4563,36 +4563,17 @@ update_next_frag_state (fragS *fragP, bf
 	      && (new_target->fr_subtype == RELAX_MAYBE_DESIRE_ALIGN
 		  || new_target->fr_subtype == RELAX_DESIRE_ALIGN));
     }
-  if (unreachable)
-    {
-      if (align_targets)
-	{
-	  next_fragP->fr_subtype = RELAX_UNREACHABLE;
-	  next_fragP->tc_frag_data.is_unreachable = TRUE;
-	  new_target->fr_subtype = RELAX_DESIRE_ALIGN;
-	  new_target->tc_frag_data.is_branch_target = TRUE;
-	}
-      while (next_fragP && next_fragP->fr_fix == 0)
-	{
-	  if (next_fragP->fr_type == rs_machine_dependent
-	      && next_fragP->fr_subtype == RELAX_LOOP_END)
-	    {
-	      next_fragP->fr_subtype = RELAX_LOOP_END_ADD_NOP;
-	      return;
-	    }
 
-	  next_fragP = next_fragP->fr_next;
-	}
-    }
-  else
+  while (next_fragP && next_fragP->fr_fix == 0)
     {
-      if (align_targets)
+      if (next_fragP->fr_type == rs_machine_dependent
+	  && next_fragP->fr_subtype == RELAX_LOOP_END)
 	{
-	  next_fragP->fr_subtype = RELAX_MAYBE_UNREACHABLE;
-	  next_fragP->tc_frag_data.is_unreachable = FALSE;
-	  new_target->fr_subtype = RELAX_MAYBE_DESIRE_ALIGN;
-	  new_target->tc_frag_data.is_branch_target = FALSE;
+	  next_fragP->fr_subtype = RELAX_LOOP_END_ADD_NOP;
+	  return;
 	}
+
+      next_fragP = next_fragP->fr_next;
     }
 }
 
@@ -9115,13 +9096,8 @@ relax_frag_immed (segT segP,
 	}
     }
 
-  /* FIXME: When a negatable branch expands and then contracts in a
-     subsequent pass, update_next_frag_state correctly updates the
-     type of the frag to RELAX_MAYBE_UNREACHABLE, but it doesn't undo
-     any expansion relax_frag_for_align may have expected it to.  For
-     now, change back to only call it when the branch expands.  */
   if (negatable_branch && istack.ninsn > 1)
-    update_next_frag_state (fragP, FALSE /* istack.ninsn > 1 */);      
+    update_next_frag_state (fragP);
 
   return this_text_diff;
 }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]