re PR target/5901 ([IA64] misplaced .body)
authorRichard Henderson <rth@redhat.com>
Wed, 13 Mar 2002 06:10:23 +0000 (22:10 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 13 Mar 2002 06:10:23 +0000 (22:10 -0800)
        PR optimization/5901
        * function.c (reposition_prologue_and_epilogue_notes): Position
        the markers after/before the last/first insn not deleted.

From-SVN: r50715

gcc/ChangeLog
gcc/function.c

index 85b0f026e2efe398a384e1f0e7dc3518ca890932..39de91fe4c38cf3da3fe048dec7a6d42f3180b91 100644 (file)
@@ -1,5 +1,12 @@
 2002-03-12  Richard Henderson  <rth@redhat.com>
 
+       PR optimization/5901
+       * function.c (reposition_prologue_and_epilogue_notes): Position
+       the markers after/before the last/first insn not deleted.
+
+2002-03-12  Richard Henderson  <rth@redhat.com>
+
+       PR optimization/5878
        * config/arc/arc.h, config/cris/cris.h, config/i386/i386.h,
        config/m68k/m68k.h, config/s390/s390.h, config/sparc/sparc.h
        (PIC_OFFSET_TABLE_REGNUM): Conditionalize on flag_pic.
index f245a063a51a9d3bb9524ca5bc8bd791be03a54a..b451eefcc893757c24341ca6282d9b0928ecdac8 100644 (file)
@@ -7782,86 +7782,90 @@ reposition_prologue_and_epilogue_notes (f)
      rtx f ATTRIBUTE_UNUSED;
 {
 #if defined (HAVE_prologue) || defined (HAVE_epilogue)
+  rtx insn, last, note;
   int len;
 
   if ((len = VARRAY_SIZE (prologue)) > 0)
     {
-      rtx insn, note = 0;
+      last = 0, note = 0;
 
       /* Scan from the beginning until we reach the last prologue insn.
         We apparently can't depend on basic_block_{head,end} after
         reorg has run.  */
-      for (insn = f; len && insn; insn = NEXT_INSN (insn))
+      for (insn = f; insn; insn = NEXT_INSN (insn))
        {
          if (GET_CODE (insn) == NOTE)
            {
              if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_PROLOGUE_END)
                note = insn;
            }
-         else if ((len -= contains (insn, prologue)) == 0)
+         else if (contains (insn, prologue))
            {
-             rtx next;
-             /* Find the prologue-end note if we haven't already, and
-                move it to just after the last prologue insn.  */
-             if (note == 0)
-               {
-                 for (note = insn; (note = NEXT_INSN (note));)
-                   if (GET_CODE (note) == NOTE
-                       && NOTE_LINE_NUMBER (note) == NOTE_INSN_PROLOGUE_END)
-                     break;
-               }
+             last = insn;
+             if (--len == 0)
+               break;
+           }
+       }
+               
+      if (last)
+       {
+         rtx next;
 
-             next = NEXT_INSN (note);
+         /* Find the prologue-end note if we haven't already, and
+            move it to just after the last prologue insn.  */
+         if (note == 0)
+           {
+             for (note = last; (note = NEXT_INSN (note));)
+               if (GET_CODE (note) == NOTE
+                   && NOTE_LINE_NUMBER (note) == NOTE_INSN_PROLOGUE_END)
+                 break;
+           }
 
-             /* Whether or not we can depend on BLOCK_HEAD,
-                attempt to keep it up-to-date.  */
-             if (BLOCK_HEAD (0) == note)
-               BLOCK_HEAD (0) = next;
+         next = NEXT_INSN (note);
 
-             remove_insn (note);
-             /* Avoid placing note between CODE_LABEL and BASIC_BLOCK note.  */
-             if (GET_CODE (insn) == CODE_LABEL)
-               insn = NEXT_INSN (insn);
-             add_insn_after (note, insn);
-           }
+         /* Avoid placing note between CODE_LABEL and BASIC_BLOCK note.  */
+         if (GET_CODE (last) == CODE_LABEL)
+           last = NEXT_INSN (last);
+         reorder_insns (note, note, last);
        }
     }
 
   if ((len = VARRAY_SIZE (epilogue)) > 0)
     {
-      rtx insn, note = 0;
+      last = 0, note = 0;
 
       /* Scan from the end until we reach the first epilogue insn.
         We apparently can't depend on basic_block_{head,end} after
         reorg has run.  */
-      for (insn = get_last_insn (); len && insn; insn = PREV_INSN (insn))
+      for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
        {
          if (GET_CODE (insn) == NOTE)
            {
              if (NOTE_LINE_NUMBER (insn) == NOTE_INSN_EPILOGUE_BEG)
                note = insn;
            }
-         else if ((len -= contains (insn, epilogue)) == 0)
+         else if (contains (insn, epilogue))
            {
-             /* Find the epilogue-begin note if we haven't already, and
-                move it to just before the first epilogue insn.  */
-             if (note == 0)
-               {
-                 for (note = insn; (note = PREV_INSN (note));)
-                   if (GET_CODE (note) == NOTE
-                       && NOTE_LINE_NUMBER (note) == NOTE_INSN_EPILOGUE_BEG)
-                     break;
-               }
-
-             /* Whether or not we can depend on BLOCK_HEAD,
-                attempt to keep it up-to-date.  */
-             if (n_basic_blocks
-                 && BLOCK_HEAD (n_basic_blocks-1) == insn)
-               BLOCK_HEAD (n_basic_blocks-1) = note;
+             last = insn;
+             if (--len == 0)
+               break;
+           }
+       }
 
-             remove_insn (note);
-             add_insn_before (note, insn);
+      if (last)
+       {
+         /* Find the epilogue-begin note if we haven't already, and
+            move it to just before the first epilogue insn.  */
+         if (note == 0)
+           {
+             for (note = insn; (note = PREV_INSN (note));)
+               if (GET_CODE (note) == NOTE
+                   && NOTE_LINE_NUMBER (note) == NOTE_INSN_EPILOGUE_BEG)
+                 break;
            }
+
+         if (PREV_INSN (last) != note)
+           reorder_insns (note, note, PREV_INSN (last));
        }
     }
 #endif /* HAVE_prologue or HAVE_epilogue */