diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 581e622c47fc16641292528029c1543541857e0e..abed43e4c475aa3fd87d13c5d1bbbc6802822272 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2008-04-01  Jan Hubicka  <jh@suse.cz>
+
+	* function.c (free_after_compilation): Free epilogue_delay_list.
+	(prepare_function_start): Assert that previous compilation was freed.
+
 2008-04-01  Jan Hubicka  <jh@suse.cz>
 	    Jim Wilson  <wilson@tuliptree.org>
 	    Andreas Tobler <andreast@gcc.gnu.org>
diff --git a/gcc/function.c b/gcc/function.c
index 325a205d827f0796424b02926a7e6ce20231afa0..5ca83b1857b7fbfae36efb3af770031cdde575e0 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -313,7 +313,8 @@ free_after_compilation (struct function *f)
   VEC_free (int, heap, prologue);
   VEC_free (int, heap, epilogue);
   VEC_free (int, heap, sibcall_epilogue);
-  free (rtl.emit.regno_pointer_align);
+  if (rtl.emit.regno_pointer_align)
+    free (rtl.emit.regno_pointer_align);
 
   memset (&rtl, 0, sizeof (rtl));
   f->eh = NULL;
@@ -323,6 +324,7 @@ free_after_compilation (struct function *f)
   f->arg_offset_rtx = NULL;
   f->return_rtx = NULL;
   f->internal_arg_pointer = NULL;
+  f->epilogue_delay_list = NULL;
 }
 
 /* Return size needed for stack frame based on slots so far allocated.
@@ -3935,6 +3937,7 @@ push_struct_function (tree fndecl)
 static void
 prepare_function_start (void)
 {
+  gcc_assert (!rtl.emit.x_last_insn);
   init_emit ();
   init_varasm_status ();
   init_expr ();