> Jan Hubicka <[EMAIL PROTECTED]> writes:
> 
> > > Jan Hubicka <[EMAIL PROTECTED]> writes:
> > > 
> > > > Producing USE expressions embedding whole INSN.  The comment promise
> > > > that those will be removed before reorg ends, but they are not.  This
> > > > patch just adds simple code to remove them in very last dbr_schedule
> > > > pass. 
> > > 
> > > I see code in dbr_schedule to delete them:
> > > 
> > >   /* Delete any USE insns made by update_block; subsequent passes don't 
> > > need
> > >      them or know how to deal with them.  */
> > >   for (insn = first; insn; insn = next)
> > >     {
> > >       next = NEXT_INSN (insn);
> > > 
> > >       if (NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == USE
> > >     && INSN_P (XEXP (PATTERN (insn), 0)))
> > >   next = delete_related_insns (insn);
> > >     }
> > > 
> > > Why is that not working?
> > 
> > Hmm, good catch. I didn't noticed that code.
> > The problem is that update_block is still called after this loop is
> > done, at least moving that loop down past the loop just bellow it solves
> > the ICE too.
> 
> Ah, it's from the calls to fill_simple_delay_slots in
> make_return_insns.  The "Delete any USE insns" loop needs to move
> below that.
> 
> > I must admit I have no idea what those placeholders are good for...
> 
> They tell mark_target_live_regs that the registers used by the insn
> which was moved are live.

Ah, I see.
The attached patch seems to work on my testcase too.

Honza

Index: reorg.c
===================================================================
--- reorg.c     (revision 128145)
+++ reorg.c     (working copy)
@@ -3863,17 +3863,6 @@ dbr_schedule (rtx first)
       relax_delay_slots (first);
     }
 
-  /* Delete any USE insns made by update_block; subsequent passes don't need
-     them or know how to deal with them.  */
-  for (insn = first; insn; insn = next)
-    {
-      next = NEXT_INSN (insn);
-
-      if (NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == USE
-         && INSN_P (XEXP (PATTERN (insn), 0)))
-       next = delete_related_insns (insn);
-    }
-
   /* If we made an end of function label, indicate that it is now
      safe to delete it by undoing our prior adjustment to LABEL_NUSES.
      If it is now unused, delete it.  */
@@ -3885,6 +3874,17 @@ dbr_schedule (rtx first)
     make_return_insns (first);
 #endif
 
+  /* Delete any USE insns made by update_block; subsequent passes don't need
+     them or know how to deal with them.  */
+  for (insn = first; insn; insn = next)
+    {
+      next = NEXT_INSN (insn);
+
+      if (NONJUMP_INSN_P (insn) && GET_CODE (PATTERN (insn)) == USE
+         && INSN_P (XEXP (PATTERN (insn), 0)))
+       next = delete_related_insns (insn);
+    }
+
   obstack_free (&unfilled_slots_obstack, unfilled_firstobj);
 
   /* It is not clear why the line below is needed, but it does seem to be.  */

Reply via email to