diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9585c69c2124e5a359dc68a5a6df3fdff3c31de3..d083a31cf0ce21810bd53dec00e482fd1ed78cf2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2003-02-19  Josef Zlomek  <zlomekj@suse.cz>
+
+	* bb-reorder.c (find_traces_1_round): Fixed condition for small
+	destination block with multiple predecessors.
+	(connect_traces): Check whether the block is a start of trace.
+
 Wed Feb 19 19:00:24 CET 2003  Jan Hubicka  <jh@suse.cz>
 
 	* calls.c (expand_call): Update call of INIT_CUMULATIVE_ARGS
diff --git a/gcc/bb-reorder.c b/gcc/bb-reorder.c
index 49889ee2ba3eec07ff36f78276e7b8e5d21241c2..f89900d470b12e2e95b1771b1d8bccc7726c0cc1 100644
--- a/gcc/bb-reorder.c
+++ b/gcc/bb-reorder.c
@@ -448,12 +448,6 @@ find_traces_1_round (branch_th, exec_th, count_th, traces, n_traces, round,
 		  || prob < branch_th || freq < exec_th || e->count < count_th)
 		continue;
 
-	      /* If the destination has multiple precessesors, and can be
-		 duplicated cheaper than a jump, don't allow it to be added
-		 to a trace.  We'll duplicate it when connecting traces.  */
-	      if (e->dest->pred->pred_next && copy_bb_p (e->dest, 0))
-		continue;
-
 	      if (better_edge_p (bb, e, prob, freq, best_prob, best_freq))
 		{
 		  best_edge = e;
@@ -462,6 +456,13 @@ find_traces_1_round (branch_th, exec_th, count_th, traces, n_traces, round,
 		}
 	    }
 
+	  /* If the best destination has multiple precessesors, and can be
+	     duplicated cheaper than a jump, don't allow it to be added
+	     to a trace.  We'll duplicate it when connecting traces.  */
+	  if (best_edge && best_edge->dest->pred->pred_next
+	      && copy_bb_p (best_edge->dest, 0))
+	    best_edge = NULL;
+
 	  /* Add all non-selected successors to the heaps.  */
 	  for (e = bb->succ; e; e = e->succ_next)
 	    {
@@ -922,15 +923,17 @@ connect_traces (n_traces, traces)
 		    edge best2 = NULL;
 		    int best2_len = 0;
 
-		    /* If the destination trace is only one block
-		       long, then no need to search the successor
+		    /* If the destination is a start of a trace which is only
+		       one block long, then no need to search the successor
 		       blocks of the trace.  Accept it.  */
-		   if (traces[bbd[e->dest->index].start_of_trace].length == 1)
-		     {
-		       best = e;
-		       try_copy = true;
-		       continue;
-		     }
+		    if (bbd[e->dest->index].start_of_trace >= 0
+			&& traces[bbd[e->dest->index].start_of_trace].length
+			   == 1)
+		      {
+			best = e;
+			try_copy = true;
+			continue;
+		      }
 
 		    for (e2 = e->dest->succ; e2; e2 = e2->succ_next)
 		      {