This is the mail archive of the gcc-bugs@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]

Re: regclass/jump problems


>I think you're on the right track, but missing a couple details.
>
>First we only call duplicate_loop_exit_test when after_regscan is true, so
>there's no need to pass that value into duplicate_loop_exit_test and test
>it before calling reg_scan_update.
>
>Second, it seems to me that you need to call reg_scan_update after you
>have copied the insns and the bounds should be the first copied insn and
>the last copied insn.  Otherwise all you've done is hide the bug -- ie you'll

I think you're right.  How about this new patch?

p.

Wed Aug 25 12:03:55 1999  Philip Blundell  <pb@nexus.co.uk>

	* jump.c (duplicate_loop_exit_test): Call reg_scan_update after
	creating new registers.

Index: jump.c
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/gcc/jump.c,v
retrieving revision 1.59.4.2
diff -u -p -r1.59.4.2 jump.c
--- jump.c	1999/05/31 13:30:06	1.59.4.2
+++ jump.c	1999/08/25 11:07:00
@@ -2548,7 +2548,7 @@ duplicate_loop_exit_test (loop_start)
      rtx loop_start;
 {
   rtx insn, set, reg, p, link;
-  rtx copy = 0;
+  rtx copy = 0, first_copy = 0;
   int num_insns = 0;
   rtx exitcode = NEXT_INSN (JUMP_LABEL (next_nonnote_insn (loop_start)));
   rtx lastexit;
@@ -2661,65 +2661,72 @@ duplicate_loop_exit_test (loop_start)
 
   /* Now copy each insn.  */
   for (insn = exitcode; insn != lastexit; insn = NEXT_INSN (insn))
-    switch (GET_CODE (insn))
-      {
-      case BARRIER:
-	copy = emit_barrier_before (loop_start);
-	break;
-      case NOTE:
-	/* Only copy line-number notes.  */
-	if (NOTE_LINE_NUMBER (insn) >= 0)
-	  {
-	    copy = emit_note_before (NOTE_LINE_NUMBER (insn), loop_start);
-	    NOTE_SOURCE_FILE (copy) = NOTE_SOURCE_FILE (insn);
-	  }
-	break;
-
-      case INSN:
-	copy = emit_insn_before (copy_rtx (PATTERN (insn)), loop_start);
-	if (reg_map)
-	  replace_regs (PATTERN (copy), reg_map, max_reg, 1);
-
-	mark_jump_label (PATTERN (copy), copy, 0);
-
-	/* Copy all REG_NOTES except REG_LABEL since mark_jump_label will
-	   make them.  */
-	for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
-	  if (REG_NOTE_KIND (link) != REG_LABEL)
-	    REG_NOTES (copy)
-	      = copy_rtx (gen_rtx_EXPR_LIST (REG_NOTE_KIND (link),
-					     XEXP (link, 0),
-					     REG_NOTES (copy)));
-	if (reg_map && REG_NOTES (copy))
-	  replace_regs (REG_NOTES (copy), reg_map, max_reg, 1);
-	break;
-
-      case JUMP_INSN:
-	copy = emit_jump_insn_before (copy_rtx (PATTERN (insn)), loop_start);
-	if (reg_map)
-	  replace_regs (PATTERN (copy), reg_map, max_reg, 1);
-	mark_jump_label (PATTERN (copy), copy, 0);
-	if (REG_NOTES (insn))
-	  {
-	    REG_NOTES (copy) = copy_rtx (REG_NOTES (insn));
-	    if (reg_map)
-	      replace_regs (REG_NOTES (copy), reg_map, max_reg, 1);
-	  }
-	
-	/* If this is a simple jump, add it to the jump chain.  */
+    {
+      switch (GET_CODE (insn))
+	{
+	case BARRIER:
+	  copy = emit_barrier_before (loop_start);
+	  break;
+	case NOTE:
+	  /* Only copy line-number notes.  */
+	  if (NOTE_LINE_NUMBER (insn) >= 0)
+	    {
+	      copy = emit_note_before (NOTE_LINE_NUMBER (insn), loop_start);
+	      NOTE_SOURCE_FILE (copy) = NOTE_SOURCE_FILE (insn);
+	    }
+	  break;
+	  
+	case INSN:
+	  copy = emit_insn_before (copy_rtx (PATTERN (insn)), loop_start);
+	  if (reg_map)
+	    replace_regs (PATTERN (copy), reg_map, max_reg, 1);
+	  
+	  mark_jump_label (PATTERN (copy), copy, 0);
+	  
+	  /* Copy all REG_NOTES except REG_LABEL since mark_jump_label will
+	     make them.  */
+	  for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
+	    if (REG_NOTE_KIND (link) != REG_LABEL)
+	      REG_NOTES (copy)
+		= copy_rtx (gen_rtx_EXPR_LIST (REG_NOTE_KIND (link),
+					       XEXP (link, 0),
+					       REG_NOTES (copy)));
+	  if (reg_map && REG_NOTES (copy))
+	    replace_regs (REG_NOTES (copy), reg_map, max_reg, 1);
+	  break;
+	  
+	case JUMP_INSN:
+	  copy = emit_jump_insn_before (copy_rtx (PATTERN (insn)), loop_start);
+	  if (reg_map)
+	    replace_regs (PATTERN (copy), reg_map, max_reg, 1);
+	  mark_jump_label (PATTERN (copy), copy, 0);
+	  if (REG_NOTES (insn))
+	    {
+	      REG_NOTES (copy) = copy_rtx (REG_NOTES (insn));
+	      if (reg_map)
+		replace_regs (REG_NOTES (copy), reg_map, max_reg, 1);
+	    }
+	  
+	  /* If this is a simple jump, add it to the jump chain.  */
+	  
+	  if (INSN_UID (copy) < max_jump_chain && JUMP_LABEL (copy)
+	      && simplejump_p (copy))
+	    {
+	      jump_chain[INSN_UID (copy)]
+		= jump_chain[INSN_UID (JUMP_LABEL (copy))];
+	      jump_chain[INSN_UID (JUMP_LABEL (copy))] = copy;
+	    }
+	  break;
+	  
+	default:
+	  abort ();
+	}
 
-	if (INSN_UID (copy) < max_jump_chain && JUMP_LABEL (copy)
-	    && simplejump_p (copy))
-	  {
-	    jump_chain[INSN_UID (copy)]
-	      = jump_chain[INSN_UID (JUMP_LABEL (copy))];
-	    jump_chain[INSN_UID (JUMP_LABEL (copy))] = copy;
-	  }
-	break;
+      if (! first_copy)
+	first_copy = copy;
+    }
 
-      default:
-	abort ();
-      }
+  reg_scan_update (first_copy, copy, max_reg);
 
   /* Now clean up by emitting a jump to the end label and deleting the jump
      at the start of the loop.  */



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