aboutsummaryrefslogtreecommitdiff
path: root/gcc/cfgexpand.c
diff options
context:
space:
mode:
authorZdenek Dvorak <dvorakz@suse.cz>2007-05-01 12:17:43 +0200
committerZdenek Dvorak <rakdver@gcc.gnu.org>2007-05-01 10:17:43 +0000
commit8b11009bad1b794283984fc806198e3cf29dbed3 (patch)
treeaf410434537ec713cf3e23d857c1ce808af279bf /gcc/cfgexpand.c
parentf5052e291a2fdb6eb5c9a968b9a1a68a12aa5866 (diff)
downloadgcc-8b11009bad1b794283984fc806198e3cf29dbed3.zip
gcc-8b11009bad1b794283984fc806198e3cf29dbed3.tar.gz
gcc-8b11009bad1b794283984fc806198e3cf29dbed3.tar.bz2
tree-ssa-loop-ivopts.c (rewrite_use_nonlinear_expr): Use bsi_after_labels.
* tree-ssa-loop-ivopts.c (rewrite_use_nonlinear_expr): Use bsi_after_labels. Always insert statements before bsi. * tree-vect-transform.c (vect_create_epilog_for_reduction): Ditto. * predict.c (apply_return_prediction): Check for empty blocks. * cfgexpand.c (lab_rtx_for_bb): New variable. (label_rtx_for_bb): Do not create new tree labels. (expand_gimple_basic_block): Add labels recorded in lab_rtx_for_bb. (tree_expand_cfg): Initialize lab_rtx_for_bb. * tree-cfg.c (build_tree_cfg): Call cleanup_dead_labels after creating edges. (label_for_bb): Add field used. (update_eh_label, main_block_label): Mark the label used. (cleanup_dead_labels): Remove unused labels. From-SVN: r124322
Diffstat (limited to 'gcc/cfgexpand.c')
-rw-r--r--gcc/cfgexpand.c43
1 files changed, 33 insertions, 10 deletions
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index c8d446f..da1e855 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -1244,6 +1244,10 @@ maybe_dump_rtl_for_tree_stmt (tree stmt, rtx since)
}
}
+/* Maps the blocks that do not contain tree labels to rtx labels. */
+
+static struct pointer_map_t *lab_rtx_for_bb;
+
/* Returns the label_rtx expression for a label starting basic block BB. */
static rtx
@@ -1251,12 +1255,17 @@ label_rtx_for_bb (basic_block bb)
{
tree_stmt_iterator tsi;
tree lab, lab_stmt;
+ void **elt;
if (bb->flags & BB_RTL)
return block_label (bb);
- /* We cannot use tree_block_label, as we no longer have stmt annotations.
- TODO -- avoid creating the new tree labels. */
+ elt = pointer_map_contains (lab_rtx_for_bb, bb);
+ if (elt)
+ return *elt;
+
+ /* Find the tree label if it is present. */
+
for (tsi = tsi_start (bb_stmt_list (bb)); !tsi_end_p (tsi); tsi_next (&tsi))
{
lab_stmt = tsi_stmt (tsi);
@@ -1270,10 +1279,9 @@ label_rtx_for_bb (basic_block bb)
return label_rtx (lab);
}
- lab = create_artificial_label ();
- lab_stmt = build1 (LABEL_EXPR, void_type_node, lab);
- tsi_link_before (&tsi, lab_stmt, TSI_NEW_STMT);
- return label_rtx (lab);
+ elt = pointer_map_insert (lab_rtx_for_bb, bb);
+ *elt = gen_label_rtx ();
+ return *elt;
}
/* A subroutine of expand_gimple_basic_block. Expand one COND_EXPR.
@@ -1477,6 +1485,7 @@ expand_gimple_basic_block (basic_block bb)
rtx note, last;
edge e;
edge_iterator ei;
+ void **elt;
if (dump_file)
{
@@ -1510,20 +1519,32 @@ expand_gimple_basic_block (basic_block bb)
tsi = tsi_start (stmts);
if (!tsi_end_p (tsi))
- stmt = tsi_stmt (tsi);
+ {
+ stmt = tsi_stmt (tsi);
+ if (TREE_CODE (stmt) != LABEL_EXPR)
+ stmt = NULL_TREE;
+ }
- if (stmt && TREE_CODE (stmt) == LABEL_EXPR)
+ elt = pointer_map_contains (lab_rtx_for_bb, bb);
+
+ if (stmt || elt)
{
last = get_last_insn ();
- expand_expr_stmt (stmt);
+ if (stmt)
+ {
+ expand_expr_stmt (stmt);
+ tsi_next (&tsi);
+ }
+
+ if (elt)
+ emit_label (*elt);
/* Java emits line number notes in the top of labels.
??? Make this go away once line number notes are obsoleted. */
BB_HEAD (bb) = NEXT_INSN (last);
if (NOTE_P (BB_HEAD (bb)))
BB_HEAD (bb) = NEXT_INSN (BB_HEAD (bb));
- tsi_next (&tsi);
note = emit_note_after (NOTE_INSN_BASIC_BLOCK, BB_HEAD (bb));
maybe_dump_rtl_for_tree_stmt (stmt, last);
@@ -1896,8 +1917,10 @@ tree_expand_cfg (void)
FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR->succs)
e->flags &= ~EDGE_EXECUTABLE;
+ lab_rtx_for_bb = pointer_map_create ();
FOR_BB_BETWEEN (bb, init_block->next_bb, EXIT_BLOCK_PTR, next_bb)
bb = expand_gimple_basic_block (bb);
+ pointer_map_destroy (lab_rtx_for_bb);
construct_exit_block ();
set_curr_insn_block (DECL_INITIAL (current_function_decl));