diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index df18afadb827d67fc70600bc4214df9a98feda18..a89927f3f143e634e4470f5d496b166c06a519a8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2004-07-16  Daniel Berlin  <dberlin@dberlin.org>
+
+	* tree-ssa-pre.c (insert_aux): Break out if we hit
+	a critical edge.
+
 2004-07-16  Richard Henderson  <rth@redhat.com>
 
 	* basic-block.h (remove_fake_exit_edges): Declare.
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c
index ba4be7b82d31b583cb54b4488be80e2a107d7935..a6943980229ae6a52ba3b9fe9867821ac20c29ac 100644
--- a/gcc/tree-ssa-pre.c
+++ b/gcc/tree-ssa-pre.c
@@ -1457,6 +1457,15 @@ insert_aux (basic_block block)
 			{
 			  tree vprime;
 			  tree edoubleprime;
+
+			  /* This can happen in the very weird case
+			     that our fake infinite loop edges have caused a
+			     critical edge to appear.  */
+			  if (EDGE_CRITICAL_P (pred))
+			    {
+			      cant_insert = true;
+			      break;
+			    }
 			  bprime = pred->src;
 			  eprime = phi_translate (node->expr,
 						  ANTIC_IN (block),