OSDN Git Service

* function.c (epilogue_done): Be ready for first basic block not
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 24 Feb 2001 02:22:07 +0000 (02:22 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 24 Feb 2001 02:22:07 +0000 (02:22 +0000)
containing PROLOGUE_END note.
(reposition_prologue_and_epilogue_notes): Avoid placing
PROLOGUE_END note between BASIC_BLOCK.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@40020 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/function.c

index 15881bd..e035967 100644 (file)
@@ -1,3 +1,10 @@
+Sat Feb 24 03:19:42 CET 2001  Jan Hubicka  <jh@suse.cz>
+
+       * function.c (epilogue_done): Be ready for first basic block not
+       containing PROLOGUE_END note.
+       (reposition_prologue_and_epilogue_notes): Avoid placing
+       PROLOGUE_END note between BASIC_BLOCK.
+
 Sat Feb 24 03:17:09 CET 2001  Jan Hubicka  <jh@suse.cz>
 
        * loop.c (canonicalize_condition): Move to reversed_comparison_code.
index 1c3ee31..a1c2d33 100644 (file)
@@ -7384,7 +7384,13 @@ epilogue_done:
         there are line number notes before where we inserted the
         prologue we should move them, and (2) we should generate a
         note before the end of the first basic block, if there isn't
-        one already there.  */
+        one already there.
+
+        ??? This behaviour is completely broken when dealing with
+        multiple entry functions.  We simply place the note always
+        into first basic block and let alternate entry points
+        to be missed.
+       */
 
       for (insn = prologue_end; insn; insn = prev)
        {
@@ -7402,7 +7408,7 @@ epilogue_done:
 
       /* Find the last line number note in the first block.  */
       for (insn = BASIC_BLOCK (0)->end;
-          insn != prologue_end;
+          insn != prologue_end && insn;
           insn = PREV_INSN (insn))
        if (GET_CODE (insn) == NOTE && NOTE_LINE_NUMBER (insn) > 0)
          break;
@@ -7487,6 +7493,9 @@ reposition_prologue_and_epilogue_notes (f)
                BLOCK_HEAD (0) = next;
 
              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);
            }
        }