diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6d290dd235b3ff25c488d450832e81093d98d106..535d095bc11e9492a0371a8f7e7807d6eb6e5f4d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+Fri Mar  8 21:27:49 CET 2002  Jan Hubicka  <jh@suse.cz>
+
+	* cfgrtl.c (purge_dead_edges): Set BB_DRITY flags if edge has been
+	removed; fix return value.
+	* combine.c (combine_instructions): Dirtify blocks where we failed to
+	update liveness; purge dead edges; use update_life_info_in_dirty_blocks.
+	* toplev.c (rest_of_compilation): Do not purge_dead_edges after combine.
+
 2002-03-08  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
 	* gcse.c (insert_insn_end_bb): Fix typo in last change.
diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c
index 7e3ebadbf04a287afd963338898f037bba24138c..6e929eb0dad7260a619990f18695e394df91ae70 100644
--- a/gcc/cfgrtl.c
+++ b/gcc/cfgrtl.c
@@ -2108,6 +2108,7 @@ purge_dead_edges (bb)
 	if (e->flags & EDGE_EH)
 	  {
 	    remove_edge (e);
+	    bb->flags |= BB_DIRTY;
 	    purged = true;
 	  }
       }
@@ -2121,7 +2122,7 @@ purge_dead_edges (bb)
       if (!any_condjump_p (insn)
 	  && !returnjump_p (insn)
 	  && !simplejump_p (insn))
-	return false;
+	return purged;
 
       /* Branch probability/prediction notes are defined only for
 	 condjumps.  We've possibly turned condjump into simplejump.  */
@@ -2154,12 +2155,13 @@ purge_dead_edges (bb)
 		   && returnjump_p (insn))
 	    continue;
 
+	  bb->flags |= BB_DIRTY;
 	  purged = true;
 	  remove_edge (e);
 	}
 
       if (!bb->succ || !purged)
-	return false;
+	return purged;
 
       if (rtl_dump_file)
 	fprintf (rtl_dump_file, "Purged edges from bb %i\n", bb->index);
@@ -2206,7 +2208,11 @@ purge_dead_edges (bb)
     {
       next = e->succ_next;
       if (!(e->flags & EDGE_FALLTHRU))
-	remove_edge (e), purged = true;
+	{
+	  bb->flags |= BB_DIRTY;
+	  remove_edge (e);
+	  purged = true;
+	}
     }
 
   if (!bb->succ || bb->succ->succ_next)
diff --git a/gcc/combine.c b/gcc/combine.c
index c9a67033dc8601bcdca4894de4cb40c9af4a365e..b734231480bffa27724f45802de43f73a2af2e37 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -739,14 +739,16 @@ combine_instructions (f, nregs)
 	  ;
 	}
     }
+  clear_bb_flags ();
 
+  EXECUTE_IF_SET_IN_SBITMAP (refresh_blocks, 0, this_basic_block,
+			     BASIC_BLOCK (this_basic_block)->flags |= BB_DIRTY);
+  new_direct_jump_p |= purge_all_dead_edges (0);
   delete_noop_moves (f);
 
-  if (need_refresh)
-    {
-      update_life_info (refresh_blocks, UPDATE_LIFE_GLOBAL_RM_NOTES,
-			PROP_DEATH_NOTES);
-    }
+  update_life_info_in_dirty_blocks (UPDATE_LIFE_GLOBAL_RM_NOTES,
+				    PROP_DEATH_NOTES | PROP_SCAN_DEAD_CODE
+				    | PROP_KILL_DEAD_CODE);
 
   /* Clean up.  */
   sbitmap_free (refresh_blocks);
diff --git a/gcc/toplev.c b/gcc/toplev.c
index bd25b41baed54128a4ab481c42fa72c1c89c88ea..740bf89221940572b588cd2165d1c138e98abc87 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -3058,10 +3058,6 @@ rest_of_compilation (decl)
       rebuild_jump_labels_after_combine
 	= combine_instructions (insns, max_reg_num ());
 
-      /* Always purge dead edges, as we may eliminate an insn throwing
-         exception.  */
-      rebuild_jump_labels_after_combine |= purge_all_dead_edges (true);
-
       /* Combining insns may have turned an indirect jump into a
 	 direct jump.  Rebuid the JUMP_LABEL fields of jumping
 	 instructions.  */