diff options
author | Zdenek Dvorak <dvorakz@suse.cz> | 2007-05-01 12:17:43 +0200 |
---|---|---|
committer | Zdenek Dvorak <rakdver@gcc.gnu.org> | 2007-05-01 10:17:43 +0000 |
commit | 8b11009bad1b794283984fc806198e3cf29dbed3 (patch) | |
tree | af410434537ec713cf3e23d857c1ce808af279bf /gcc/cfgexpand.c | |
parent | f5052e291a2fdb6eb5c9a968b9a1a68a12aa5866 (diff) | |
download | gcc-8b11009bad1b794283984fc806198e3cf29dbed3.tar.gz |
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.c | 43 |
1 files changed, 33 insertions, 10 deletions
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index c8d446f12bd..da1e8552e24 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)); |