gcc_assert (INDEX_EDGE_PRED_BB (el, edge_index) != EXIT_BLOCK_PTR);
if (INDEX_EDGE_PRED_BB (el, edge_index) == ENTRY_BLOCK_PTR)
- ending_block = ENTRY_BLOCK_PTR->next_bb;
+ ending_block = single_succ (ENTRY_BLOCK_PTR);
else
ending_block = find_pdom (INDEX_EDGE_PRED_BB (el, edge_index));
mark_stmt_if_obviously_necessary (tree stmt, bool aggressive)
{
stmt_ann_t ann;
- tree op, def;
- ssa_op_iter iter;
+ tree op;
/* With non-call exceptions, we have to assume that all statements could
throw. If a statement may throw, it is inherently necessary. */
return;
}
- FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF)
- {
- if (is_global_var (SSA_NAME_VAR (def)))
- {
- mark_stmt_necessary (stmt, true);
- return;
- }
- }
if (is_hidden_global_store (stmt))
{
mark_stmt_necessary (stmt, true);
gcc_assert (dom_computed[CDI_POST_DOMINATORS] == DOM_OK);
/* Get the immediate post dominator of bb. */
post_dom_bb = get_immediate_dominator (CDI_POST_DOMINATORS, bb);
- /* Some blocks don't have an immediate post dominator. This can happen
- for example with infinite loops. Removing an infinite loop is an
- inappropriate transformation anyway... */
- if (! post_dom_bb)
- {
- bsi_next (i);
- return;
- }
- /* If the post dominator block has PHI nodes, we might be unable
- to compute the right PHI args for them. Since the control
- statement is unnecessary, all edges can be regarded as
- equivalent, but we have to get rid of the condition, since it
- might reference a variable that was determined to be
- unnecessary and thus removed. */
- if (phi_nodes (post_dom_bb))
- post_dom_bb = EDGE_SUCC (bb, 0)->dest;
+ /* There are three particularly problematical cases.
+
+ 1. Blocks that do not have an immediate post dominator. This
+ can happen with infinite loops.
+
+ 2. Blocks that are only post dominated by the exit block. These
+ can also happen for infinite loops as we create fake edges
+ in the dominator tree.
+
+ 3. If the post dominator has PHI nodes we may be able to compute
+ the right PHI args for them.
+
+
+ In each of these cases we must remove the control statement
+ as it may reference SSA_NAMEs which are going to be removed and
+ we remove all but one outgoing edge from the block. */
+ if (! post_dom_bb
+ || post_dom_bb == EXIT_BLOCK_PTR
+ || phi_nodes (post_dom_bb))
+ ;
else
{
/* Redirect the first edge out of BB to reach POST_DOM_BB. */
not have TRUE/FALSE flags. */
EDGE_SUCC (bb, 0)->flags &= ~(EDGE_TRUE_VALUE | EDGE_FALSE_VALUE);
- /* If the edge reaches any block other than the exit, then it is a
- fallthru edge; if it reaches the exit, then it is not a fallthru
- edge. */
- if (post_dom_bb != EXIT_BLOCK_PTR)
- EDGE_SUCC (bb, 0)->flags |= EDGE_FALLTHRU;
- else
- EDGE_SUCC (bb, 0)->flags &= ~EDGE_FALLTHRU;
+ /* The lone outgoing edge from BB will be a fallthru edge. */
+ EDGE_SUCC (bb, 0)->flags |= EDGE_FALLTHRU;
/* Remove the remaining the outgoing edges. */
while (!single_succ_p (bb))
tree def = DEF_FROM_PTR (def_p);
mark_sym_for_renaming (SSA_NAME_VAR (def));
}
- bsi_remove (i);
+ bsi_remove (i, true);
release_defs (t);
}
\f
{
int i;
- control_dependence_map
- = xmalloc (last_basic_block * sizeof (bitmap));
+ control_dependence_map = XNEWVEC (bitmap, last_basic_block);
for (i = 0; i < last_basic_block; ++i)
control_dependence_map[i] = BITMAP_ALLOC (NULL);
0, /* properties_destroyed */
0, /* todo_flags_start */
TODO_dump_func
- | TODO_update_ssa_no_phi
+ | TODO_update_ssa
| TODO_cleanup_cfg
| TODO_ggc_collect
- | TODO_verify_ssa, /* todo_flags_finish */
+ | TODO_verify_ssa
+ | TODO_remove_unused_locals, /* todo_flags_finish */
0 /* letter */
};
0, /* properties_destroyed */
0, /* todo_flags_start */
TODO_dump_func
- | TODO_update_ssa_no_phi
+ | TODO_update_ssa
| TODO_cleanup_cfg
| TODO_verify_ssa, /* todo_flags_finish */
0 /* letter */
0, /* properties_destroyed */
0, /* todo_flags_start */
TODO_dump_func
- | TODO_update_ssa_no_phi
+ | TODO_update_ssa
| TODO_cleanup_cfg
| TODO_ggc_collect
| TODO_verify_ssa