From 016030fea6d929c69ce92ec45b797da303c09ab6 Mon Sep 17 00:00:00 2001
From: Jan Hubicka <jh@suse.cz>
Date: Sat, 24 Feb 2001 03:22:07 +0100
Subject: [PATCH] function.c (epilogue_done): Be ready for first basic block
 not containing PROLOGUE_END note.

	* 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.

From-SVN: r40020
---
 gcc/ChangeLog  |  7 +++++++
 gcc/function.c | 13 +++++++++++--
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 15881bdc9bce..e0359670eb3e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/function.c b/gcc/function.c
index 1c3ee315d6ef..a1c2d3389d0e 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -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);
 	    }
 	}
-- 
GitLab