This is the mail archive of the gcc-patches@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]
Other format: [Raw text]

[PATCH] Fix ICE in distribute_notes (PR bootstrap/51796)


Hi!

My recent patch which adds REG_ARGS_SIZE note to all
!ACCUMULATE_OUTGOING_ARGS noreturn calls introduced a regression,
the checking code in distribute_notes can ICE if something
is combned with the noreturn call and the noreturn call has
the same REG_ARGS_SIZE value as before.
Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux,
ok for trunk?

2012-01-10  Jakub Jelinek  <jakub@redhat.com>

	PR bootstrap/51796
	* combine.c (distribute_notes): If i3 is a noreturn call,
	allow old_size to be equal to args_size.

--- gcc/combine.c	2011-12-09 15:21:20.548649331 +0100
+++ gcc/combine.c	2012-01-10 00:10:59.303836653 +0100
@@ -13282,7 +13282,21 @@ distribute_notes (rtx notes, rtx from_in
 	    {
 	      int old_size, args_size = INTVAL (XEXP (note, 0));
 	      old_size = fixup_args_size_notes (PREV_INSN (i3), i3, args_size);
-	      gcc_assert (old_size != args_size);
+	      if (old_size == args_size)
+		{
+		  /* emit_call_1 adds for !ACCUMULATE_OUTGOING_ARGS
+		     REG_ARGS_SIZE note to all noreturn calls, so allow those
+		     here.  */
+		  gcc_assert (CALL_P (i3) && !ACCUMULATE_OUTGOING_ARGS);
+		  if (find_reg_note (i3, REG_NORETURN, NULL_RTX) == NULL_RTX)
+		    {
+		      rtx n;
+		      for (n = next_note; n; n = XEXP (n, 1))
+			if (REG_NOTE_KIND (n) == REG_NORETURN)
+			  break;
+		      gcc_assert (n);
+		    }
+		}
 	    }
 	  break;
 
--- gcc/testsuite/gcc.dg/pr51796.c.jj	2012-01-10 16:35:53.917661308 +0100
+++ gcc/testsuite/gcc.dg/pr51796.c	2012-01-10 16:36:36.000880045 +0100
@@ -0,0 +1,16 @@
+/* PR bootstrap/51796 */
+/* { dg-do compile } */
+/* { dg-options "-Os -fno-omit-frame-pointer -fno-tree-dominator-opts -fno-tree-fre -fno-tree-pre" } */
+
+typedef void (*entry_func) (void) __attribute__ ((noreturn));
+extern entry_func entry_addr;
+static void bsd_boot_entry (void)
+{
+  stop ();
+}   
+void bsd_boot (void)
+{
+  entry_addr = (entry_func) bsd_boot_entry;
+  (*entry_addr) ();
+}
+

	Jakub


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