+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
|| 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;
}
}
+ /* 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)
{
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)
{