tree-optimize (execute_fixup_cfg): Set after_inlining flag.

2007-01-02  Jan Hubicka  <jh@suse.cz>

	* tree-optimize (execute_fixup_cfg): Set after_inlining flag.
	Set NOTHROW flag on call statements proved to be nothrow.
	Update statement of local calls so new pure/const functions are
	updated. Update_ssa when in ssa form. Mark PHI nodes of nonlocal
	goto receivers.
	(tree_rest_of_compilation): Register hooks and initialize bitmap
	early. Do not set after_inlining flag.

From-SVN: r120357
This commit is contained in:
Jan Hubicka 2007-01-02 22:33:45 +01:00 committed by Jan Hubicka
parent a063525a3a
commit de6bd996eb
2 changed files with 73 additions and 29 deletions

View File

@ -1,3 +1,13 @@
2007-01-02 Jan Hubicka <jh@suse.cz>
* tree-optimize (execute_fixup_cfg): Set after_inlining flag.
Set NOTHROW flag on call statements proved to be nothrow.
Update statement of local calls so new pure/const functions are
updated. Update_ssa when in ssa form. Mark PHI nodes of nonlocal
goto receivers.
(tree_rest_of_compilation): Register hooks and initialize bitmap
early. Do not set after_inlining flag.
2007-01-02 Steve Ellcey <sje@cup.hp.com> 2007-01-02 Steve Ellcey <sje@cup.hp.com>
* sbitmap.c (HOST_BITS_PER_LONG_LONG): Change to * sbitmap.c (HOST_BITS_PER_LONG_LONG): Change to

View File

@ -264,6 +264,8 @@ execute_fixup_cfg (void)
basic_block bb; basic_block bb;
block_stmt_iterator bsi; block_stmt_iterator bsi;
cfun->after_inlining = true;
if (cfun->eh) if (cfun->eh)
FOR_EACH_BB (bb) FOR_EACH_BB (bb)
{ {
@ -271,9 +273,16 @@ execute_fixup_cfg (void)
{ {
tree stmt = bsi_stmt (bsi); tree stmt = bsi_stmt (bsi);
tree call = get_call_expr_in (stmt); tree call = get_call_expr_in (stmt);
tree decl = call ? get_callee_fndecl (call) : NULL;
if (call && call_expr_flags (call) & (ECF_CONST | ECF_PURE)) if (decl && call_expr_flags (call) & (ECF_CONST | ECF_PURE)
TREE_SIDE_EFFECTS (call) = 0; && TREE_SIDE_EFFECTS (call))
{
update_stmt (stmt);
TREE_SIDE_EFFECTS (call) = 0;
}
if (decl && TREE_NOTHROW (decl))
TREE_NOTHROW (call) = 1;
if (!tree_could_throw_p (stmt) && lookup_stmt_eh_region (stmt)) if (!tree_could_throw_p (stmt) && lookup_stmt_eh_region (stmt))
remove_stmt_from_eh_region (stmt); remove_stmt_from_eh_region (stmt);
} }
@ -281,29 +290,55 @@ execute_fixup_cfg (void)
} }
if (current_function_has_nonlocal_label) if (current_function_has_nonlocal_label)
FOR_EACH_BB (bb) {
{ FOR_EACH_BB (bb)
for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi)) {
{ for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
tree stmt = bsi_stmt (bsi); {
if (tree_can_make_abnormal_goto (stmt)) tree stmt = bsi_stmt (bsi);
{ if (tree_can_make_abnormal_goto (stmt))
if (stmt == bsi_stmt (bsi_last (bb))) {
{ if (stmt == bsi_stmt (bsi_last (bb)))
if (!has_abnormal_outgoing_edge_p (bb)) {
if (!has_abnormal_outgoing_edge_p (bb))
make_abnormal_goto_edges (bb, true);
}
else
{
edge e = split_block (bb, stmt);
bb = e->src;
make_abnormal_goto_edges (bb, true); make_abnormal_goto_edges (bb, true);
} }
else break;
{ }
edge e = split_block (bb, stmt);
bb = e->src;
make_abnormal_goto_edges (bb, true);
}
break;
}
}
}
/* Update PHIs on nonlocal goto receivers we (possibly)
just created new edges into. */
if (TREE_CODE (stmt) == LABEL_EXPR
&& gimple_in_ssa_p (cfun))
{
tree target = LABEL_EXPR_LABEL (stmt);
if (DECL_NONLOCAL (target))
{
tree phi;
for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
{
gcc_assert (SSA_NAME_OCCURS_IN_ABNORMAL_PHI
(PHI_RESULT (phi)));
mark_sym_for_renaming
(SSA_NAME_VAR (PHI_RESULT (phi)));
}
}
}
}
}
}
if (gimple_in_ssa_p (cfun))
{
delete_unreachable_blocks ();
update_ssa (TODO_update_ssa);
}
cleanup_tree_cfg (); cleanup_tree_cfg ();
/* Dump a textual representation of the flowgraph. */ /* Dump a textual representation of the flowgraph. */
@ -408,6 +443,9 @@ tree_rest_of_compilation (tree fndecl)
node = cgraph_node (fndecl); node = cgraph_node (fndecl);
/* Initialize the default bitmap obstack. */
bitmap_obstack_initialize (NULL);
/* We might need the body of this function so that we can expand /* We might need the body of this function so that we can expand
it inline somewhere else. */ it inline somewhere else. */
if (cgraph_preserve_function_body_p (fndecl)) if (cgraph_preserve_function_body_p (fndecl))
@ -424,7 +462,8 @@ tree_rest_of_compilation (tree fndecl)
We haven't necessarily assigned RTL to all variables yet, so it's We haven't necessarily assigned RTL to all variables yet, so it's
not safe to try to expand expressions involving them. */ not safe to try to expand expressions involving them. */
cfun->x_dont_save_pending_sizes_p = 1; cfun->x_dont_save_pending_sizes_p = 1;
cfun->after_inlining = true;
tree_register_cfg_hooks ();
if (flag_inline_trees) if (flag_inline_trees)
{ {
@ -453,12 +492,7 @@ tree_rest_of_compilation (tree fndecl)
Kill it so it won't confuse us. */ Kill it so it won't confuse us. */
cgraph_node_remove_callees (node); cgraph_node_remove_callees (node);
/* Initialize the default bitmap obstack. */
bitmap_obstack_initialize (NULL);
bitmap_obstack_initialize (&reg_obstack); /* FIXME, only at RTL generation*/ bitmap_obstack_initialize (&reg_obstack); /* FIXME, only at RTL generation*/
tree_register_cfg_hooks ();
/* Perform all tree transforms and optimizations. */ /* Perform all tree transforms and optimizations. */
execute_pass_list (all_passes); execute_pass_list (all_passes);