This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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]

Re: java/5183: reorg.c fix for sparc


On Tue, Jan 01, 2002 at 02:29:05PM -0500, Jeff Sturm wrote:
> In fill_slots_from_thread we remove an insn from the branch target before
> reinserting into the delay slot.  If the insn has a REG_LABEL note that
> may cause LABEL_NUSES to fall to zero momentarily (and delete the label).
> 
> As I understand it, delete_related_insns is deprecated, and shouldn't be
> used anyhow.  Assuming a bootstrap completes on sparc-sun-solaris2.8, OK
> to commit?

I think a safer idea is to keep the label reference count up to date.

Tested briefly with your java test case.  I'll run it through a 
complete sparc bootstrap in a moment.



r~


	* reorg.c (emit_delay_sequence): Increment label reference count
	if any REG_LABEL notes.
	(fill_slots_from_thread): Fob LABEL_NUSES around delete_related_insns.

Index: reorg.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/reorg.c,v
retrieving revision 1.67
diff -u -p -r1.67 reorg.c
--- reorg.c	2001/10/11 03:16:03	1.67
+++ reorg.c	2002/01/01 23:04:02
@@ -489,7 +489,7 @@ emit_delay_sequence (insn, list, length)
   for (li = list; li; li = XEXP (li, 1), i++)
     {
       rtx tem = XEXP (li, 0);
-      rtx note;
+      rtx note, next;
 
       /* Show that this copy of the insn isn't deleted.  */
       INSN_DELETED_P (tem) = 0;
@@ -498,11 +498,26 @@ emit_delay_sequence (insn, list, length)
       PREV_INSN (tem) = XVECEXP (seq, 0, i - 1);
       NEXT_INSN (XVECEXP (seq, 0, i - 1)) = tem;
 
-      /* Remove any REG_DEAD notes because we can't rely on them now
-	 that the insn has been moved.  */
-      for (note = REG_NOTES (tem); note; note = XEXP (note, 1))
-	if (REG_NOTE_KIND (note) == REG_DEAD)
-	  XEXP (note, 0) = const0_rtx;
+      for (note = REG_NOTES (tem); note; note = next)
+	{
+	  next = XEXP (note, 1);
+	  switch (REG_NOTE_KIND (note))
+	    {
+	    case REG_DEAD:
+	      /* Remove any REG_DEAD notes because we can't rely on them now
+		 that the insn has been moved.  */
+	      remove_note (tem, note);
+	      break;
+
+	    case REG_LABEL:
+	      /* Keep the label reference count up to date.  */
+	      LABEL_NUSES (XEXP (note, 0)) ++;
+	      break;
+
+	    default:
+	      break;
+	    }
+	}
     }
 
   NEXT_INSN (XVECEXP (seq, 0, length)) = NEXT_INSN (seq_insn);
@@ -2703,6 +2718,8 @@ fill_slots_from_thread (insn, condition,
 		     starting point of this thread.  */
 		  if (own_thread)
 		    {
+		      rtx note;
+
 		      update_block (trial, thread);
 		      if (trial == thread)
 			{
@@ -2710,7 +2727,18 @@ fill_slots_from_thread (insn, condition,
 			  if (new_thread == trial)
 			    new_thread = thread;
 			}
+
+		      /* We are moving this insn, not deleting it.  We must
+			 temporarily increment the use count on any referenced
+			 label lest it be deleted by delete_related_insns.  */
+		      note = find_reg_note (trial, REG_LABEL, 0);
+		      if (note)
+			LABEL_NUSES (XEXP (note, 0))++;
+
 		      delete_related_insns (trial);
+
+		      if (note)
+			LABEL_NUSES (XEXP (note, 0))--;
 		    }
 		  else
 		    new_thread = next_active_insn (trial);


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