basic-block.h (basic_block_def): Kill rbi.
* basic-block.h (basic_block_def): Kill rbi. (reorder_block_def): Kill; Remove next field (replaced by aux); move other fields to ... (rtl_bb_info): ... here. * bb-reorder.c (find_traces, rotate_loop, find_traces_1_round, copy_bb, connect_traces, add_labels_and_missing_jumps fix_up_fall_thru_edges, fix_crossing_conditional_branches, duplicate_computed_gotos, partition_hot_cold_basic-blocks): Update to new fields. * cfg.c (initialize_bb_rbi): Kill. * cfglayout.c (record_effective_endpoints, fixup_reorder_chain, fixup_fallthru_exit_predecessor, cfg_layout_duplicate_bb): Update. * cfgrtl.c (cfg_layout_create_basic_block): Do not initialize rbi. (try_redirect_by_replacing_jump): Update rbi references. (cfg_layout_split_block): Likewise. (cfg_layout_delete_block): Likewise. (cfg_layout_merge_blocks): Likewise. * function.c (thread_prologue_and_epilogue_insns): Likewise. * passes.c (rest_of_handle_sms): Likewise. * tracer.c (seen, tail_duplicate, layout_superblocks): Likewise. From-SVN: r101359
This commit is contained in:
parent
4ebe7d9317
commit
370369e1a7
9 changed files with 157 additions and 164 deletions
|
@ -1,3 +1,26 @@
|
|||
2005-06-28 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* basic-block.h (basic_block_def): Kill rbi.
|
||||
(reorder_block_def): Kill; Remove next field (replaced by aux);
|
||||
move other fields to ...
|
||||
(rtl_bb_info): ... here.
|
||||
* bb-reorder.c (find_traces, rotate_loop, find_traces_1_round,
|
||||
copy_bb, connect_traces, add_labels_and_missing_jumps
|
||||
fix_up_fall_thru_edges, fix_crossing_conditional_branches,
|
||||
duplicate_computed_gotos, partition_hot_cold_basic-blocks):
|
||||
Update to new fields.
|
||||
* cfg.c (initialize_bb_rbi): Kill.
|
||||
* cfglayout.c (record_effective_endpoints, fixup_reorder_chain,
|
||||
fixup_fallthru_exit_predecessor, cfg_layout_duplicate_bb): Update.
|
||||
* cfgrtl.c (cfg_layout_create_basic_block): Do not initialize rbi.
|
||||
(try_redirect_by_replacing_jump): Update rbi references.
|
||||
(cfg_layout_split_block): Likewise.
|
||||
(cfg_layout_delete_block): Likewise.
|
||||
(cfg_layout_merge_blocks): Likewise.
|
||||
* function.c (thread_prologue_and_epilogue_insns): Likewise.
|
||||
* passes.c (rest_of_handle_sms): Likewise.
|
||||
* tracer.c (seen, tail_duplicate, layout_superblocks): Likewise.
|
||||
|
||||
2005-06-27 David Edelsohn <edelsohn@gnu.org>
|
||||
|
||||
* config/rs6000/rs6000.c (rs6000_file_start): Note PPC405 erratum
|
||||
|
|
|
@ -233,9 +233,6 @@ struct basic_block_def GTY((chain_next ("%h.next_bb"), chain_prev ("%h.prev_bb")
|
|||
struct basic_block_def *prev_bb;
|
||||
struct basic_block_def *next_bb;
|
||||
|
||||
/* The data used by basic block copying and reordering functions. */
|
||||
struct reorder_block_def * rbi;
|
||||
|
||||
union basic_block_il_dependent {
|
||||
struct rtl_bb_info * GTY ((tag ("1"))) rtl;
|
||||
} GTY ((desc ("((%1.flags & BB_RTL) != 0)"))) il;
|
||||
|
@ -273,25 +270,17 @@ struct rtl_bb_info GTY(())
|
|||
|
||||
/* The registers that are live on exit from this block. */
|
||||
bitmap GTY ((skip (""))) global_live_at_end;
|
||||
};
|
||||
|
||||
typedef struct basic_block_def *basic_block;
|
||||
|
||||
/* Structure to hold information about the blocks during reordering and
|
||||
copying. Needs to be put on a diet. */
|
||||
|
||||
struct reorder_block_def GTY(())
|
||||
{
|
||||
/* In CFGlayout mode points to insn notes/jumptables to be placed just before
|
||||
and after the block. */
|
||||
rtx header;
|
||||
rtx footer;
|
||||
|
||||
basic_block next;
|
||||
|
||||
/* This field is used by the bb-reorder and tracer passes. */
|
||||
int visited;
|
||||
};
|
||||
|
||||
typedef struct reorder_block_def *reorder_block_def;
|
||||
typedef struct basic_block_def *basic_block;
|
||||
|
||||
#define BB_FREQ_MAX 10000
|
||||
|
||||
|
@ -940,9 +929,6 @@ extern void reorder_basic_blocks (unsigned int);
|
|||
extern void duplicate_computed_gotos (void);
|
||||
extern void partition_hot_cold_basic_blocks (void);
|
||||
|
||||
/* In cfg.c */
|
||||
extern void initialize_bb_rbi (basic_block bb);
|
||||
|
||||
/* In dominance.c */
|
||||
|
||||
enum cdi_direction
|
||||
|
|
|
@ -272,7 +272,7 @@ find_traces (int *n_traces, struct trace *traces)
|
|||
basic_block bb;
|
||||
fprintf (dump_file, "Trace %d (round %d): ", i + 1,
|
||||
traces[i].round + 1);
|
||||
for (bb = traces[i].first; bb != traces[i].last; bb = bb->rbi->next)
|
||||
for (bb = traces[i].first; bb != traces[i].last; bb = bb->aux)
|
||||
fprintf (dump_file, "%d [%d] ", bb->index, bb->frequency);
|
||||
fprintf (dump_file, "%d [%d]\n", bb->index, bb->frequency);
|
||||
}
|
||||
|
@ -306,14 +306,14 @@ rotate_loop (edge back_edge, struct trace *trace, int trace_n)
|
|||
|
||||
FOR_EACH_EDGE (e, ei, bb->succs)
|
||||
if (e->dest != EXIT_BLOCK_PTR
|
||||
&& e->dest->rbi->visited != trace_n
|
||||
&& e->dest->il.rtl->visited != trace_n
|
||||
&& (e->flags & EDGE_CAN_FALLTHRU)
|
||||
&& !(e->flags & EDGE_COMPLEX))
|
||||
{
|
||||
if (is_preferred)
|
||||
{
|
||||
/* The best edge is preferred. */
|
||||
if (!e->dest->rbi->visited
|
||||
if (!e->dest->il.rtl->visited
|
||||
|| bbd[e->dest->index].start_of_trace >= 0)
|
||||
{
|
||||
/* The current edge E is also preferred. */
|
||||
|
@ -329,7 +329,7 @@ rotate_loop (edge back_edge, struct trace *trace, int trace_n)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (!e->dest->rbi->visited
|
||||
if (!e->dest->il.rtl->visited
|
||||
|| bbd[e->dest->index].start_of_trace >= 0)
|
||||
{
|
||||
/* The current edge E is preferred. */
|
||||
|
@ -352,7 +352,7 @@ rotate_loop (edge back_edge, struct trace *trace, int trace_n)
|
|||
}
|
||||
}
|
||||
}
|
||||
bb = bb->rbi->next;
|
||||
bb = bb->aux;
|
||||
}
|
||||
while (bb != back_edge->dest);
|
||||
|
||||
|
@ -362,17 +362,17 @@ rotate_loop (edge back_edge, struct trace *trace, int trace_n)
|
|||
the trace. */
|
||||
if (back_edge->dest == trace->first)
|
||||
{
|
||||
trace->first = best_bb->rbi->next;
|
||||
trace->first = best_bb->aux;
|
||||
}
|
||||
else
|
||||
{
|
||||
basic_block prev_bb;
|
||||
|
||||
for (prev_bb = trace->first;
|
||||
prev_bb->rbi->next != back_edge->dest;
|
||||
prev_bb = prev_bb->rbi->next)
|
||||
prev_bb->aux != back_edge->dest;
|
||||
prev_bb = prev_bb->aux)
|
||||
;
|
||||
prev_bb->rbi->next = best_bb->rbi->next;
|
||||
prev_bb->aux = best_bb->aux;
|
||||
|
||||
/* Try to get rid of uncond jump to cond jump. */
|
||||
if (single_succ_p (prev_bb))
|
||||
|
@ -393,7 +393,7 @@ rotate_loop (edge back_edge, struct trace *trace, int trace_n)
|
|||
/* We have not found suitable loop tail so do no rotation. */
|
||||
best_bb = back_edge->src;
|
||||
}
|
||||
best_bb->rbi->next = NULL;
|
||||
best_bb->aux = NULL;
|
||||
return best_bb;
|
||||
}
|
||||
|
||||
|
@ -402,7 +402,7 @@ rotate_loop (edge back_edge, struct trace *trace, int trace_n)
|
|||
static void
|
||||
mark_bb_visited (basic_block bb, int trace)
|
||||
{
|
||||
bb->rbi->visited = trace;
|
||||
bb->il.rtl->visited = trace;
|
||||
if (bbd[bb->index].heap)
|
||||
{
|
||||
fibheap_delete_node (bbd[bb->index].heap, bbd[bb->index].node);
|
||||
|
@ -496,8 +496,8 @@ find_traces_1_round (int branch_th, int exec_th, gcov_type count_th,
|
|||
if (e->dest == EXIT_BLOCK_PTR)
|
||||
continue;
|
||||
|
||||
if (e->dest->rbi->visited
|
||||
&& e->dest->rbi->visited != *n_traces)
|
||||
if (e->dest->il.rtl->visited
|
||||
&& e->dest->il.rtl->visited != *n_traces)
|
||||
continue;
|
||||
|
||||
if (BB_PARTITION (e->dest) != BB_PARTITION (bb))
|
||||
|
@ -550,7 +550,7 @@ find_traces_1_round (int branch_th, int exec_th, gcov_type count_th,
|
|||
{
|
||||
if (e == best_edge
|
||||
|| e->dest == EXIT_BLOCK_PTR
|
||||
|| e->dest->rbi->visited)
|
||||
|| e->dest->il.rtl->visited)
|
||||
continue;
|
||||
|
||||
key = bb_to_key (e->dest);
|
||||
|
@ -611,7 +611,7 @@ find_traces_1_round (int branch_th, int exec_th, gcov_type count_th,
|
|||
|
||||
if (best_edge) /* Suitable successor was found. */
|
||||
{
|
||||
if (best_edge->dest->rbi->visited == *n_traces)
|
||||
if (best_edge->dest->il.rtl->visited == *n_traces)
|
||||
{
|
||||
/* We do nothing with one basic block loops. */
|
||||
if (best_edge->dest != bb)
|
||||
|
@ -631,7 +631,7 @@ find_traces_1_round (int branch_th, int exec_th, gcov_type count_th,
|
|||
"Rotating loop %d - %d\n",
|
||||
best_edge->dest->index, bb->index);
|
||||
}
|
||||
bb->rbi->next = best_edge->dest;
|
||||
bb->aux = best_edge->dest;
|
||||
bbd[best_edge->dest->index].in_trace =
|
||||
(*n_traces) - 1;
|
||||
bb = rotate_loop (best_edge, trace, *n_traces);
|
||||
|
@ -681,7 +681,7 @@ find_traces_1_round (int branch_th, int exec_th, gcov_type count_th,
|
|||
if (e != best_edge
|
||||
&& (e->flags & EDGE_CAN_FALLTHRU)
|
||||
&& !(e->flags & EDGE_COMPLEX)
|
||||
&& !e->dest->rbi->visited
|
||||
&& !e->dest->il.rtl->visited
|
||||
&& single_pred_p (e->dest)
|
||||
&& !(e->flags & EDGE_CROSSING)
|
||||
&& single_succ_p (e->dest)
|
||||
|
@ -698,7 +698,7 @@ find_traces_1_round (int branch_th, int exec_th, gcov_type count_th,
|
|||
break;
|
||||
}
|
||||
|
||||
bb->rbi->next = best_edge->dest;
|
||||
bb->aux = best_edge->dest;
|
||||
bbd[best_edge->dest->index].in_trace = (*n_traces) - 1;
|
||||
bb = best_edge->dest;
|
||||
}
|
||||
|
@ -715,7 +715,7 @@ find_traces_1_round (int branch_th, int exec_th, gcov_type count_th,
|
|||
FOR_EACH_EDGE (e, ei, bb->succs)
|
||||
{
|
||||
if (e->dest == EXIT_BLOCK_PTR
|
||||
|| e->dest->rbi->visited)
|
||||
|| e->dest->il.rtl->visited)
|
||||
continue;
|
||||
|
||||
if (bbd[e->dest->index].heap)
|
||||
|
@ -757,15 +757,15 @@ copy_bb (basic_block old_bb, edge e, basic_block bb, int trace)
|
|||
BB_COPY_PARTITION (new_bb, old_bb);
|
||||
|
||||
gcc_assert (e->dest == new_bb);
|
||||
gcc_assert (!e->dest->rbi->visited);
|
||||
gcc_assert (!e->dest->il.rtl->visited);
|
||||
|
||||
if (dump_file)
|
||||
fprintf (dump_file,
|
||||
"Duplicated bb %d (created bb %d)\n",
|
||||
old_bb->index, new_bb->index);
|
||||
new_bb->rbi->visited = trace;
|
||||
new_bb->rbi->next = bb->rbi->next;
|
||||
bb->rbi->next = new_bb;
|
||||
new_bb->il.rtl->visited = trace;
|
||||
new_bb->aux = bb->aux;
|
||||
bb->aux = new_bb;
|
||||
|
||||
if (new_bb->index >= array_size || last_basic_block > array_size)
|
||||
{
|
||||
|
@ -973,7 +973,7 @@ connect_traces (int n_traces, struct trace *traces)
|
|||
}
|
||||
if (best)
|
||||
{
|
||||
best->src->rbi->next = best->dest;
|
||||
best->src->aux = best->dest;
|
||||
t2 = bbd[best->src->index].end_of_trace;
|
||||
connected[t2] = true;
|
||||
|
||||
|
@ -988,7 +988,7 @@ connect_traces (int n_traces, struct trace *traces)
|
|||
}
|
||||
|
||||
if (last_trace >= 0)
|
||||
traces[last_trace].last->rbi->next = traces[t2].first;
|
||||
traces[last_trace].last->aux = traces[t2].first;
|
||||
last_trace = t;
|
||||
|
||||
/* Find the successor traces. */
|
||||
|
@ -1026,7 +1026,7 @@ connect_traces (int n_traces, struct trace *traces)
|
|||
best->src->index, best->dest->index);
|
||||
}
|
||||
t = bbd[best->dest->index].start_of_trace;
|
||||
traces[last_trace].last->rbi->next = traces[t].first;
|
||||
traces[last_trace].last->aux = traces[t].first;
|
||||
connected[t] = true;
|
||||
last_trace = t;
|
||||
}
|
||||
|
@ -1119,7 +1119,7 @@ connect_traces (int n_traces, struct trace *traces)
|
|||
if (next_bb && next_bb != EXIT_BLOCK_PTR)
|
||||
{
|
||||
t = bbd[next_bb->index].start_of_trace;
|
||||
traces[last_trace].last->rbi->next = traces[t].first;
|
||||
traces[last_trace].last->aux = traces[t].first;
|
||||
connected[t] = true;
|
||||
last_trace = t;
|
||||
}
|
||||
|
@ -1137,7 +1137,7 @@ connect_traces (int n_traces, struct trace *traces)
|
|||
basic_block bb;
|
||||
|
||||
fprintf (dump_file, "Final order:\n");
|
||||
for (bb = traces[0].first; bb; bb = bb->rbi->next)
|
||||
for (bb = traces[0].first; bb; bb = bb->aux)
|
||||
fprintf (dump_file, "%d ", bb->index);
|
||||
fprintf (dump_file, "\n");
|
||||
fflush (dump_file);
|
||||
|
@ -1305,7 +1305,7 @@ add_labels_and_missing_jumps (edge *crossing_edges, int n_crossing_edges)
|
|||
barrier = emit_barrier_after (new_jump);
|
||||
JUMP_LABEL (new_jump) = label;
|
||||
LABEL_NUSES (label) += 1;
|
||||
src->rbi->footer = unlink_insn_chain (barrier, barrier);
|
||||
src->il.rtl->footer = unlink_insn_chain (barrier, barrier);
|
||||
/* Mark edge as non-fallthru. */
|
||||
crossing_edges[i]->flags &= ~EDGE_FALLTHRU;
|
||||
} /* end: 'if (GET_CODE ... ' */
|
||||
|
@ -1395,7 +1395,7 @@ fix_up_fall_thru_edges (void)
|
|||
the cond jump does). */
|
||||
|
||||
if (!cond_jump_crosses
|
||||
&& cur_bb->rbi->next == cond_jump->dest)
|
||||
&& cur_bb->aux == cond_jump->dest)
|
||||
{
|
||||
/* Find label in fall_thru block. We've already added
|
||||
any missing labels, so there must be one. */
|
||||
|
@ -1430,8 +1430,8 @@ fix_up_fall_thru_edges (void)
|
|||
|
||||
if (new_bb)
|
||||
{
|
||||
new_bb->rbi->next = cur_bb->rbi->next;
|
||||
cur_bb->rbi->next = new_bb;
|
||||
new_bb->aux = cur_bb->aux;
|
||||
cur_bb->aux = new_bb;
|
||||
|
||||
/* Make sure new fall-through bb is in same
|
||||
partition as bb it's falling through from. */
|
||||
|
@ -1445,13 +1445,13 @@ fix_up_fall_thru_edges (void)
|
|||
if (new_bb)
|
||||
{
|
||||
barrier = emit_barrier_after (BB_END (new_bb));
|
||||
new_bb->rbi->footer = unlink_insn_chain (barrier,
|
||||
new_bb->il.rtl->footer = unlink_insn_chain (barrier,
|
||||
barrier);
|
||||
}
|
||||
else
|
||||
{
|
||||
barrier = emit_barrier_after (BB_END (cur_bb));
|
||||
cur_bb->rbi->footer = unlink_insn_chain (barrier,
|
||||
cur_bb->il.rtl->footer = unlink_insn_chain (barrier,
|
||||
barrier);
|
||||
}
|
||||
}
|
||||
|
@ -1597,8 +1597,8 @@ fix_crossing_conditional_branches (void)
|
|||
conditional jump. */
|
||||
|
||||
new_bb = create_basic_block (NULL, NULL, last_bb);
|
||||
new_bb->rbi->next = last_bb->rbi->next;
|
||||
last_bb->rbi->next = new_bb;
|
||||
new_bb->aux = last_bb->aux;
|
||||
last_bb->aux = new_bb;
|
||||
prev_bb = last_bb;
|
||||
last_bb = new_bb;
|
||||
|
||||
|
@ -1634,7 +1634,7 @@ fix_crossing_conditional_branches (void)
|
|||
|
||||
barrier = emit_barrier_after (new_jump);
|
||||
JUMP_LABEL (new_jump) = old_label;
|
||||
new_bb->rbi->footer = unlink_insn_chain (barrier,
|
||||
new_bb->il.rtl->footer = unlink_insn_chain (barrier,
|
||||
barrier);
|
||||
|
||||
/* Make sure new bb is in same partition as source
|
||||
|
@ -2008,7 +2008,7 @@ duplicate_computed_gotos (void)
|
|||
|
||||
/* Build the reorder chain for the original order of blocks. */
|
||||
if (bb->next_bb != EXIT_BLOCK_PTR)
|
||||
bb->rbi->next = bb->next_bb;
|
||||
bb->aux = bb->next_bb;
|
||||
|
||||
/* Obviously the block has to end in a computed jump. */
|
||||
if (!computed_jump_p (BB_END (bb)))
|
||||
|
@ -2048,10 +2048,10 @@ duplicate_computed_gotos (void)
|
|||
/* Duplicate computed gotos. */
|
||||
FOR_EACH_BB (bb)
|
||||
{
|
||||
if (bb->rbi->visited)
|
||||
if (bb->il.rtl->visited)
|
||||
continue;
|
||||
|
||||
bb->rbi->visited = 1;
|
||||
bb->il.rtl->visited = 1;
|
||||
|
||||
/* BB must have one outgoing edge. That edge must not lead to
|
||||
the exit block or the next block.
|
||||
|
@ -2067,9 +2067,9 @@ duplicate_computed_gotos (void)
|
|||
continue;
|
||||
|
||||
new_bb = duplicate_block (single_succ (bb), single_succ_edge (bb));
|
||||
new_bb->rbi->next = bb->rbi->next;
|
||||
bb->rbi->next = new_bb;
|
||||
new_bb->rbi->visited = 1;
|
||||
new_bb->aux = bb->aux;
|
||||
bb->aux = new_bb;
|
||||
new_bb->il.rtl->visited = 1;
|
||||
}
|
||||
|
||||
done:
|
||||
|
@ -2156,7 +2156,7 @@ partition_hot_cold_basic_blocks (void)
|
|||
FOR_EACH_BB (cur_bb)
|
||||
if (cur_bb->index >= 0
|
||||
&& cur_bb->next_bb->index >= 0)
|
||||
cur_bb->rbi->next = cur_bb->next_bb;
|
||||
cur_bb->aux = cur_bb->next_bb;
|
||||
|
||||
find_rarely_executed_basic_blocks_and_crossing_edges (crossing_edges,
|
||||
&n_crossing_edges,
|
||||
|
|
10
gcc/cfg.c
10
gcc/cfg.c
|
@ -136,16 +136,6 @@ alloc_block (void)
|
|||
return bb;
|
||||
}
|
||||
|
||||
/* Initialize rbi (the structure containing data used by basic block
|
||||
duplication and reordering) for the given basic block. */
|
||||
|
||||
void
|
||||
initialize_bb_rbi (basic_block bb)
|
||||
{
|
||||
gcc_assert (!bb->rbi);
|
||||
bb->rbi = ggc_alloc_cleared (sizeof (struct reorder_block_def));
|
||||
}
|
||||
|
||||
/* Link block B to chain after AFTER. */
|
||||
void
|
||||
link_block (basic_block b, basic_block after)
|
||||
|
|
|
@ -209,11 +209,11 @@ record_effective_endpoints (void)
|
|||
rtx end;
|
||||
|
||||
if (PREV_INSN (BB_HEAD (bb)) && next_insn != BB_HEAD (bb))
|
||||
bb->rbi->header = unlink_insn_chain (next_insn,
|
||||
bb->il.rtl->header = unlink_insn_chain (next_insn,
|
||||
PREV_INSN (BB_HEAD (bb)));
|
||||
end = skip_insns_after_block (bb);
|
||||
if (NEXT_INSN (BB_END (bb)) && BB_END (bb) != end)
|
||||
bb->rbi->footer = unlink_insn_chain (NEXT_INSN (BB_END (bb)), end);
|
||||
bb->il.rtl->footer = unlink_insn_chain (NEXT_INSN (BB_END (bb)), end);
|
||||
next_insn = NEXT_INSN (BB_END (bb));
|
||||
}
|
||||
|
||||
|
@ -584,16 +584,16 @@ fixup_reorder_chain (void)
|
|||
|
||||
for (bb = ENTRY_BLOCK_PTR->next_bb, index = 0;
|
||||
bb != 0;
|
||||
bb = bb->rbi->next, index++)
|
||||
bb = bb->aux, index++)
|
||||
{
|
||||
if (bb->rbi->header)
|
||||
if (bb->il.rtl->header)
|
||||
{
|
||||
if (insn)
|
||||
NEXT_INSN (insn) = bb->rbi->header;
|
||||
NEXT_INSN (insn) = bb->il.rtl->header;
|
||||
else
|
||||
set_first_insn (bb->rbi->header);
|
||||
PREV_INSN (bb->rbi->header) = insn;
|
||||
insn = bb->rbi->header;
|
||||
set_first_insn (bb->il.rtl->header);
|
||||
PREV_INSN (bb->il.rtl->header) = insn;
|
||||
insn = bb->il.rtl->header;
|
||||
while (NEXT_INSN (insn))
|
||||
insn = NEXT_INSN (insn);
|
||||
}
|
||||
|
@ -603,10 +603,10 @@ fixup_reorder_chain (void)
|
|||
set_first_insn (BB_HEAD (bb));
|
||||
PREV_INSN (BB_HEAD (bb)) = insn;
|
||||
insn = BB_END (bb);
|
||||
if (bb->rbi->footer)
|
||||
if (bb->il.rtl->footer)
|
||||
{
|
||||
NEXT_INSN (insn) = bb->rbi->footer;
|
||||
PREV_INSN (bb->rbi->footer) = insn;
|
||||
NEXT_INSN (insn) = bb->il.rtl->footer;
|
||||
PREV_INSN (bb->il.rtl->footer) = insn;
|
||||
while (NEXT_INSN (insn))
|
||||
insn = NEXT_INSN (insn);
|
||||
}
|
||||
|
@ -630,7 +630,7 @@ fixup_reorder_chain (void)
|
|||
/* Now add jumps and labels as needed to match the blocks new
|
||||
outgoing edges. */
|
||||
|
||||
for (bb = ENTRY_BLOCK_PTR->next_bb; bb ; bb = bb->rbi->next)
|
||||
for (bb = ENTRY_BLOCK_PTR->next_bb; bb ; bb = bb->aux)
|
||||
{
|
||||
edge e_fall, e_taken, e;
|
||||
rtx bb_end_insn;
|
||||
|
@ -656,7 +656,7 @@ fixup_reorder_chain (void)
|
|||
if (any_condjump_p (bb_end_insn))
|
||||
{
|
||||
/* If the old fallthru is still next, nothing to do. */
|
||||
if (bb->rbi->next == e_fall->dest
|
||||
if (bb->aux == e_fall->dest
|
||||
|| e_fall->dest == EXIT_BLOCK_PTR)
|
||||
continue;
|
||||
|
||||
|
@ -699,7 +699,7 @@ fixup_reorder_chain (void)
|
|||
such as happens at the very end of a function, then we'll
|
||||
need to add a new unconditional jump. Choose the taken
|
||||
edge based on known or assumed probability. */
|
||||
else if (bb->rbi->next != e_taken->dest)
|
||||
else if (bb->aux != e_taken->dest)
|
||||
{
|
||||
rtx note = find_reg_note (bb_end_insn, REG_BR_PROB, 0);
|
||||
|
||||
|
@ -762,7 +762,7 @@ fixup_reorder_chain (void)
|
|||
continue;
|
||||
|
||||
/* If the fallthru block is still next, nothing to do. */
|
||||
if (bb->rbi->next == e_fall->dest)
|
||||
if (bb->aux == e_fall->dest)
|
||||
continue;
|
||||
|
||||
/* A fallthru to exit block. */
|
||||
|
@ -774,10 +774,9 @@ fixup_reorder_chain (void)
|
|||
nb = force_nonfallthru (e_fall);
|
||||
if (nb)
|
||||
{
|
||||
initialize_bb_rbi (nb);
|
||||
nb->rbi->visited = 1;
|
||||
nb->rbi->next = bb->rbi->next;
|
||||
bb->rbi->next = nb;
|
||||
nb->il.rtl->visited = 1;
|
||||
nb->aux = bb->aux;
|
||||
bb->aux = nb;
|
||||
/* Don't process this new block. */
|
||||
bb = nb;
|
||||
|
||||
|
@ -802,7 +801,7 @@ fixup_reorder_chain (void)
|
|||
fprintf (dump_file, "Reordered sequence:\n");
|
||||
for (bb = ENTRY_BLOCK_PTR->next_bb, index = 0;
|
||||
bb;
|
||||
bb = bb->rbi->next, index++)
|
||||
bb = bb->aux, index++)
|
||||
{
|
||||
fprintf (dump_file, " %i ", index);
|
||||
if (get_bb_original (bb))
|
||||
|
@ -821,7 +820,7 @@ fixup_reorder_chain (void)
|
|||
bb = ENTRY_BLOCK_PTR->next_bb;
|
||||
index = 0;
|
||||
|
||||
for (; bb; prev_bb = bb, bb = bb->rbi->next, index ++)
|
||||
for (; bb; prev_bb = bb, bb = bb->aux, index ++)
|
||||
{
|
||||
bb->index = index;
|
||||
BASIC_BLOCK (index) = bb;
|
||||
|
@ -893,7 +892,7 @@ fixup_fallthru_exit_predecessor (void)
|
|||
if (e->flags & EDGE_FALLTHRU)
|
||||
bb = e->src;
|
||||
|
||||
if (bb && bb->rbi->next)
|
||||
if (bb && bb->aux)
|
||||
{
|
||||
basic_block c = ENTRY_BLOCK_PTR->next_bb;
|
||||
|
||||
|
@ -902,22 +901,21 @@ fixup_fallthru_exit_predecessor (void)
|
|||
if (c == bb)
|
||||
{
|
||||
bb = split_block (bb, NULL)->dest;
|
||||
initialize_bb_rbi (bb);
|
||||
bb->rbi->next = c->rbi->next;
|
||||
c->rbi->next = bb;
|
||||
bb->rbi->footer = c->rbi->footer;
|
||||
c->rbi->footer = NULL;
|
||||
bb->aux = c->aux;
|
||||
c->aux = bb;
|
||||
bb->il.rtl->footer = c->il.rtl->footer;
|
||||
c->il.rtl->footer = NULL;
|
||||
}
|
||||
|
||||
while (c->rbi->next != bb)
|
||||
c = c->rbi->next;
|
||||
while (c->aux != bb)
|
||||
c = c->aux;
|
||||
|
||||
c->rbi->next = bb->rbi->next;
|
||||
while (c->rbi->next)
|
||||
c = c->rbi->next;
|
||||
c->aux = bb->aux;
|
||||
while (c->aux)
|
||||
c = c->aux;
|
||||
|
||||
c->rbi->next = bb;
|
||||
bb->rbi->next = NULL;
|
||||
c->aux = bb;
|
||||
bb->aux = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1057,24 +1055,24 @@ cfg_layout_duplicate_bb (basic_block bb)
|
|||
EXIT_BLOCK_PTR->prev_bb);
|
||||
|
||||
BB_COPY_PARTITION (new_bb, bb);
|
||||
if (bb->rbi->header)
|
||||
if (bb->il.rtl->header)
|
||||
{
|
||||
insn = bb->rbi->header;
|
||||
insn = bb->il.rtl->header;
|
||||
while (NEXT_INSN (insn))
|
||||
insn = NEXT_INSN (insn);
|
||||
insn = duplicate_insn_chain (bb->rbi->header, insn);
|
||||
insn = duplicate_insn_chain (bb->il.rtl->header, insn);
|
||||
if (insn)
|
||||
new_bb->rbi->header = unlink_insn_chain (insn, get_last_insn ());
|
||||
new_bb->il.rtl->header = unlink_insn_chain (insn, get_last_insn ());
|
||||
}
|
||||
|
||||
if (bb->rbi->footer)
|
||||
if (bb->il.rtl->footer)
|
||||
{
|
||||
insn = bb->rbi->footer;
|
||||
insn = bb->il.rtl->footer;
|
||||
while (NEXT_INSN (insn))
|
||||
insn = NEXT_INSN (insn);
|
||||
insn = duplicate_insn_chain (bb->rbi->footer, insn);
|
||||
insn = duplicate_insn_chain (bb->il.rtl->footer, insn);
|
||||
if (insn)
|
||||
new_bb->rbi->footer = unlink_insn_chain (insn, get_last_insn ());
|
||||
new_bb->il.rtl->footer = unlink_insn_chain (insn, get_last_insn ());
|
||||
}
|
||||
|
||||
if (bb->il.rtl->global_live_at_start)
|
||||
|
@ -1100,11 +1098,6 @@ cfg_layout_duplicate_bb (basic_block bb)
|
|||
void
|
||||
cfg_layout_initialize (unsigned int flags)
|
||||
{
|
||||
basic_block bb;
|
||||
|
||||
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
|
||||
initialize_bb_rbi (bb);
|
||||
|
||||
initialize_original_copy_tables ();
|
||||
|
||||
cfg_layout_rtl_register_cfg_hooks ();
|
||||
|
@ -1142,8 +1135,8 @@ break_superblocks (void)
|
|||
free (superblocks);
|
||||
}
|
||||
|
||||
/* Finalize the changes: reorder insn list according to the sequence, enter
|
||||
compensation code, rebuild scope forest. */
|
||||
/* Finalize the changes: reorder insn list according to the sequence specified
|
||||
by aux pointers, enter compensation code, rebuild scope forest. */
|
||||
|
||||
void
|
||||
cfg_layout_finalize (void)
|
||||
|
@ -1166,7 +1159,11 @@ cfg_layout_finalize (void)
|
|||
verify_insn_chain ();
|
||||
#endif
|
||||
FOR_BB_BETWEEN (bb, ENTRY_BLOCK_PTR, NULL, next_bb)
|
||||
bb->rbi = NULL;
|
||||
{
|
||||
bb->il.rtl->header = bb->il.rtl->footer = NULL;
|
||||
bb->aux = NULL;
|
||||
bb->il.rtl->visited = 0;
|
||||
}
|
||||
|
||||
break_superblocks ();
|
||||
|
||||
|
|
55
gcc/cfgrtl.c
55
gcc/cfgrtl.c
|
@ -345,7 +345,6 @@ cfg_layout_create_basic_block (void *head, void *end, basic_block after)
|
|||
{
|
||||
basic_block newbb = rtl_create_basic_block (head, end, after);
|
||||
|
||||
initialize_bb_rbi (newbb);
|
||||
return newbb;
|
||||
}
|
||||
|
||||
|
@ -713,7 +712,7 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
|
|||
/* Selectively unlink whole insn chain. */
|
||||
if (in_cfglayout)
|
||||
{
|
||||
rtx insn = src->rbi->footer;
|
||||
rtx insn = src->il.rtl->footer;
|
||||
|
||||
delete_insn_chain (kill_from, BB_END (src));
|
||||
|
||||
|
@ -725,7 +724,7 @@ try_redirect_by_replacing_jump (edge e, basic_block target, bool in_cfglayout)
|
|||
if (PREV_INSN (insn))
|
||||
NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
|
||||
else
|
||||
src->rbi->footer = NEXT_INSN (insn);
|
||||
src->il.rtl->footer = NEXT_INSN (insn);
|
||||
if (NEXT_INSN (insn))
|
||||
PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
|
||||
}
|
||||
|
@ -2490,8 +2489,8 @@ cfg_layout_split_block (basic_block bb, void *insnp)
|
|||
rtx insn = insnp;
|
||||
basic_block new_bb = rtl_split_block (bb, insn);
|
||||
|
||||
new_bb->rbi->footer = bb->rbi->footer;
|
||||
bb->rbi->footer = NULL;
|
||||
new_bb->il.rtl->footer = bb->il.rtl->footer;
|
||||
bb->il.rtl->footer = NULL;
|
||||
|
||||
return new_bb;
|
||||
}
|
||||
|
@ -2597,24 +2596,24 @@ cfg_layout_delete_block (basic_block bb)
|
|||
{
|
||||
rtx insn, next, prev = PREV_INSN (BB_HEAD (bb)), *to, remaints;
|
||||
|
||||
if (bb->rbi->header)
|
||||
if (bb->il.rtl->header)
|
||||
{
|
||||
next = BB_HEAD (bb);
|
||||
if (prev)
|
||||
NEXT_INSN (prev) = bb->rbi->header;
|
||||
NEXT_INSN (prev) = bb->il.rtl->header;
|
||||
else
|
||||
set_first_insn (bb->rbi->header);
|
||||
PREV_INSN (bb->rbi->header) = prev;
|
||||
insn = bb->rbi->header;
|
||||
set_first_insn (bb->il.rtl->header);
|
||||
PREV_INSN (bb->il.rtl->header) = prev;
|
||||
insn = bb->il.rtl->header;
|
||||
while (NEXT_INSN (insn))
|
||||
insn = NEXT_INSN (insn);
|
||||
NEXT_INSN (insn) = next;
|
||||
PREV_INSN (next) = insn;
|
||||
}
|
||||
next = NEXT_INSN (BB_END (bb));
|
||||
if (bb->rbi->footer)
|
||||
if (bb->il.rtl->footer)
|
||||
{
|
||||
insn = bb->rbi->footer;
|
||||
insn = bb->il.rtl->footer;
|
||||
while (insn)
|
||||
{
|
||||
if (BARRIER_P (insn))
|
||||
|
@ -2622,7 +2621,7 @@ cfg_layout_delete_block (basic_block bb)
|
|||
if (PREV_INSN (insn))
|
||||
NEXT_INSN (PREV_INSN (insn)) = NEXT_INSN (insn);
|
||||
else
|
||||
bb->rbi->footer = NEXT_INSN (insn);
|
||||
bb->il.rtl->footer = NEXT_INSN (insn);
|
||||
if (NEXT_INSN (insn))
|
||||
PREV_INSN (NEXT_INSN (insn)) = PREV_INSN (insn);
|
||||
}
|
||||
|
@ -2630,11 +2629,11 @@ cfg_layout_delete_block (basic_block bb)
|
|||
break;
|
||||
insn = NEXT_INSN (insn);
|
||||
}
|
||||
if (bb->rbi->footer)
|
||||
if (bb->il.rtl->footer)
|
||||
{
|
||||
insn = BB_END (bb);
|
||||
NEXT_INSN (insn) = bb->rbi->footer;
|
||||
PREV_INSN (bb->rbi->footer) = insn;
|
||||
NEXT_INSN (insn) = bb->il.rtl->footer;
|
||||
PREV_INSN (bb->il.rtl->footer) = insn;
|
||||
while (NEXT_INSN (insn))
|
||||
insn = NEXT_INSN (insn);
|
||||
NEXT_INSN (insn) = next;
|
||||
|
@ -2645,12 +2644,10 @@ cfg_layout_delete_block (basic_block bb)
|
|||
}
|
||||
}
|
||||
if (bb->next_bb != EXIT_BLOCK_PTR)
|
||||
to = &bb->next_bb->rbi->header;
|
||||
to = &bb->next_bb->il.rtl->header;
|
||||
else
|
||||
to = &cfg_layout_function_footer;
|
||||
|
||||
bb->rbi = NULL;
|
||||
|
||||
rtl_delete_block (bb);
|
||||
|
||||
if (prev)
|
||||
|
@ -2727,13 +2724,13 @@ cfg_layout_merge_blocks (basic_block a, basic_block b)
|
|||
gcc_assert (!JUMP_P (BB_END (a)));
|
||||
|
||||
/* Possible line number notes should appear in between. */
|
||||
if (b->rbi->header)
|
||||
if (b->il.rtl->header)
|
||||
{
|
||||
rtx first = BB_END (a), last;
|
||||
|
||||
last = emit_insn_after_noloc (b->rbi->header, BB_END (a));
|
||||
last = emit_insn_after_noloc (b->il.rtl->header, BB_END (a));
|
||||
delete_insn_chain (NEXT_INSN (first), last);
|
||||
b->rbi->header = NULL;
|
||||
b->il.rtl->header = NULL;
|
||||
}
|
||||
|
||||
/* In the case basic blocks are not adjacent, move them around. */
|
||||
|
@ -2769,20 +2766,20 @@ cfg_layout_merge_blocks (basic_block a, basic_block b)
|
|||
}
|
||||
|
||||
/* Possible tablejumps and barriers should appear after the block. */
|
||||
if (b->rbi->footer)
|
||||
if (b->il.rtl->footer)
|
||||
{
|
||||
if (!a->rbi->footer)
|
||||
a->rbi->footer = b->rbi->footer;
|
||||
if (!a->il.rtl->footer)
|
||||
a->il.rtl->footer = b->il.rtl->footer;
|
||||
else
|
||||
{
|
||||
rtx last = a->rbi->footer;
|
||||
rtx last = a->il.rtl->footer;
|
||||
|
||||
while (NEXT_INSN (last))
|
||||
last = NEXT_INSN (last);
|
||||
NEXT_INSN (last) = b->rbi->footer;
|
||||
PREV_INSN (b->rbi->footer) = last;
|
||||
NEXT_INSN (last) = b->il.rtl->footer;
|
||||
PREV_INSN (b->il.rtl->footer) = last;
|
||||
}
|
||||
b->rbi->footer = NULL;
|
||||
b->il.rtl->footer = NULL;
|
||||
}
|
||||
a->il.rtl->global_live_at_end = b->il.rtl->global_live_at_end;
|
||||
|
||||
|
|
|
@ -5233,7 +5233,7 @@ thread_prologue_and_epilogue_insns (rtx f ATTRIBUTE_UNUSED)
|
|||
cfg_layout_initialize (0);
|
||||
FOR_EACH_BB (cur_bb)
|
||||
if (cur_bb->index >= 0 && cur_bb->next_bb->index >= 0)
|
||||
cur_bb->rbi->next = cur_bb->next_bb;
|
||||
cur_bb->aux = cur_bb->next_bb;
|
||||
cfg_layout_finalize ();
|
||||
}
|
||||
epilogue_done:
|
||||
|
|
|
@ -600,7 +600,7 @@ rest_of_handle_sms (void)
|
|||
/* Finalize layout changes. */
|
||||
FOR_EACH_BB (bb)
|
||||
if (bb->next_bb != EXIT_BLOCK_PTR)
|
||||
bb->rbi->next = bb->next_bb;
|
||||
bb->aux = bb->next_bb;
|
||||
cfg_layout_finalize ();
|
||||
free_dominance_info (CDI_DOMINATORS);
|
||||
ggc_collect ();
|
||||
|
@ -1187,7 +1187,7 @@ rest_of_handle_loop2 (void)
|
|||
/* Finalize layout changes. */
|
||||
FOR_EACH_BB (bb)
|
||||
if (bb->next_bb != EXIT_BLOCK_PTR)
|
||||
bb->rbi->next = bb->next_bb;
|
||||
bb->aux = bb->next_bb;
|
||||
cfg_layout_finalize ();
|
||||
|
||||
cleanup_cfg (CLEANUP_EXPENSIVE);
|
||||
|
|
22
gcc/tracer.c
22
gcc/tracer.c
|
@ -65,7 +65,7 @@ static int branch_ratio_cutoff;
|
|||
/* Return true if BB has been seen - it is connected to some trace
|
||||
already. */
|
||||
|
||||
#define seen(bb) (bb->rbi->visited || bb->rbi->next)
|
||||
#define seen(bb) (bb->il.rtl->visited || bb->aux)
|
||||
|
||||
/* Return true if we should ignore the basic block for purposes of tracing. */
|
||||
static bool
|
||||
|
@ -292,8 +292,8 @@ tail_duplicate (void)
|
|||
fprintf (dump_file, "Duplicated %i as %i [%i]\n",
|
||||
old->index, bb2->index, bb2->frequency);
|
||||
}
|
||||
bb->rbi->next = bb2;
|
||||
bb2->rbi->visited = 1;
|
||||
bb->aux = bb2;
|
||||
bb2->il.rtl->visited = 1;
|
||||
bb = bb2;
|
||||
/* In case the trace became infrequent, stop duplicating. */
|
||||
if (ignore_bb_p (bb))
|
||||
|
@ -328,28 +328,28 @@ layout_superblocks (void)
|
|||
{
|
||||
edge_iterator ei;
|
||||
edge e, best = NULL;
|
||||
while (end->rbi->next)
|
||||
end = end->rbi->next;
|
||||
while (end->aux)
|
||||
end = end->aux;
|
||||
|
||||
FOR_EACH_EDGE (e, ei, end->succs)
|
||||
if (e->dest != EXIT_BLOCK_PTR
|
||||
&& e->dest != single_succ (ENTRY_BLOCK_PTR)
|
||||
&& !e->dest->rbi->visited
|
||||
&& !e->dest->il.rtl->visited
|
||||
&& (!best || EDGE_FREQUENCY (e) > EDGE_FREQUENCY (best)))
|
||||
best = e;
|
||||
|
||||
if (best)
|
||||
{
|
||||
end->rbi->next = best->dest;
|
||||
best->dest->rbi->visited = 1;
|
||||
end->aux = best->dest;
|
||||
best->dest->il.rtl->visited = 1;
|
||||
}
|
||||
else
|
||||
for (; bb != EXIT_BLOCK_PTR; bb = bb->next_bb)
|
||||
{
|
||||
if (!bb->rbi->visited)
|
||||
if (!bb->il.rtl->visited)
|
||||
{
|
||||
end->rbi->next = bb;
|
||||
bb->rbi->visited = 1;
|
||||
end->aux = bb;
|
||||
bb->il.rtl->visited = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue