This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: test patch for computed gotos
- From: Richard Henderson <rth at redhat dot com>
- To: Brad Lucier <lucier at math dot purdue dot edu>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Mon, 10 Feb 2003 18:14:49 -0800
- Subject: Re: test patch for computed gotos
- References: <20030209130019.GA11462@redhat.com>
FYI, the bb-reorder changes vs mainline from this are as follows
(assuming I havn't missed a hunk).
r~
Index: bb-reorder.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/bb-reorder.c,v
retrieving revision 1.53
diff -c -p -d -u -r1.53 bb-reorder.c
--- bb-reorder.c 10 Feb 2003 19:18:42 -0000 1.53
+++ bb-reorder.c 11 Feb 2003 01:48:23 -0000
@@ -448,6 +448,12 @@ find_traces_1_round (branch_th, exec_th,
|| 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;
@@ -905,19 +911,27 @@ connect_traces (n_traces, traces)
/* Try to connect the traces by duplication of 1 block. */
edge e2;
basic_block next_bb = NULL;
+ bool try_copy = false;
for (e = traces[t].last->succ; e; e = e->succ_next)
if (e->dest != EXIT_BLOCK_PTR
&& (e->flags & EDGE_CAN_FALLTHRU)
&& !(e->flags & EDGE_COMPLEX)
- && (EDGE_FREQUENCY (e) >= freq_threshold)
- && (e->count >= count_threshold)
- && (!best
- || e->probability > best->probability))
+ && (!best || e->probability > best->probability))
{
edge best2 = NULL;
int best2_len = 0;
+ /* If the destination trace is only one block
+ long, then no need to search the successor
+ blocks of the trace. Accept it. */
+ if (traces[start_of_trace[e->dest->index]].length == 1)
+ {
+ best = e;
+ try_copy = true;
+ continue;
+ }
+
for (e2 = e->dest->succ; e2; e2 = e2->succ_next)
{
int di = e2->dest->index;
@@ -942,10 +956,18 @@ connect_traces (n_traces, traces)
else
best2_len = INT_MAX;
next_bb = e2->dest;
+ try_copy = true;
}
}
}
- if (best && next_bb && copy_bb_p (best->dest, !optimize_size))
+
+ /* Copy tiny blocks always; copy larger blocks only when the
+ edge is traversed frequently enough. */
+ if (try_copy
+ && copy_bb_p (best->dest,
+ !optimize_size
+ && EDGE_FREQUENCY (best) >= freq_threshold
+ && best->count >= count_threshold))
{
basic_block new_bb;
@@ -953,7 +975,9 @@ connect_traces (n_traces, traces)
{
fprintf (rtl_dump_file, "Connection: %d %d ",
traces[t].last->index, best->dest->index);
- if (next_bb == EXIT_BLOCK_PTR)
+ if (!next_bb)
+ fputc ('\n', rtl_dump_file);
+ else if (next_bb == EXIT_BLOCK_PTR)
fprintf (rtl_dump_file, "exit\n");
else
fprintf (rtl_dump_file, "%d\n", next_bb->index);
@@ -961,7 +985,7 @@ connect_traces (n_traces, traces)
new_bb = copy_bb (best->dest, best, traces[t].last, t);
traces[t].last = new_bb;
- if (next_bb != EXIT_BLOCK_PTR)
+ if (next_bb && next_bb != EXIT_BLOCK_PTR)
{
t = bbd[next_bb->index].start_of_trace;
RBI (traces[last_trace].last)->next = traces[t].first;