diff options
author | Jan Hubicka <jh@suse.cz> | 2009-05-10 17:20:27 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2009-05-10 15:20:27 +0000 |
commit | 078c364462f5cb2d20d94a59ab415358531ebe9a (patch) | |
tree | 61b85b391f0c78ef701455d729295c995e219fbd /gcc | |
parent | ea5783ee951110121aa7746e1c54749640f16351 (diff) | |
download | gcc-078c364462f5cb2d20d94a59ab415358531ebe9a.zip gcc-078c364462f5cb2d20d94a59ab415358531ebe9a.tar.gz gcc-078c364462f5cb2d20d94a59ab415358531ebe9a.tar.bz2 |
tree-inline.c (delete_unreachable_blocks_update_callgraph): Declare.
* tree-inline.c (delete_unreachable_blocks_update_callgraph): Declare.
(estimate_move_cost): Assert that it does not get called for VOID_TYPE_P.
(estimate_num_insns): Skip VOID types in argument handling.
(optimize_inline_calls): Delete unreachable blocks and verify that
callgraph is valid.
From-SVN: r147344
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/tree-inline.c | 19 |
2 files changed, 23 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 516f4d9..23022ff 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,13 @@ 2009-05-10 Jan Hubicka <jh@suse.cz> + * tree-inline.c (delete_unreachable_blocks_update_callgraph): Declare. + (estimate_move_cost): Assert that it does not get called for VOID_TYPE_P. + (estimate_num_insns): Skip VOID types in argument handling. + (optimize_inline_calls): Delete unreachable blocks and verify that + callgraph is valid. + +2009-05-10 Jan Hubicka <jh@suse.cz> + * cgraphbuild.c (record_reference): Use cgraph_mark_address_taken_node. * cgraph.c (cgraph_mark_address_taken_node): New function. (dump_cgraph_node): Dump new flag. diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 403b5a0..752766b 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -132,6 +132,7 @@ static tree copy_decl_to_var (tree, copy_body_data *); static tree copy_result_decl_to_var (tree, copy_body_data *); static tree copy_decl_maybe_to_var (tree, copy_body_data *); static gimple remap_gimple_stmt (gimple, copy_body_data *); +static bool delete_unreachable_blocks_update_callgraph (copy_body_data *id); /* Insert a tree->tree mapping for ID. Despite the name suggests that the trees should be variables, it is used for more than that. */ @@ -2768,6 +2769,8 @@ estimate_move_cost (tree type) { HOST_WIDE_INT size; + gcc_assert (!VOID_TYPE_P (type)); + size = int_size_in_bytes (type); if (size < 0 || size > MOVE_MAX_PIECES * MOVE_RATIO (!optimize_size)) @@ -3013,20 +3016,24 @@ estimate_num_insns (gimple stmt, eni_weights *weights) { tree arg; for (arg = DECL_ARGUMENTS (decl); arg; arg = TREE_CHAIN (arg)) - cost += estimate_move_cost (TREE_TYPE (arg)); + if (!VOID_TYPE_P (TREE_TYPE (arg))) + cost += estimate_move_cost (TREE_TYPE (arg)); } else if (funtype && prototype_p (funtype)) { tree t; - for (t = TYPE_ARG_TYPES (funtype); t; t = TREE_CHAIN (t)) - cost += estimate_move_cost (TREE_VALUE (t)); + for (t = TYPE_ARG_TYPES (funtype); t && t != void_list_node; + t = TREE_CHAIN (t)) + if (!VOID_TYPE_P (TREE_VALUE (t))) + cost += estimate_move_cost (TREE_VALUE (t)); } else { for (i = 0; i < gimple_call_num_args (stmt); i++) { tree arg = gimple_call_arg (stmt, i); - cost += estimate_move_cost (TREE_TYPE (arg)); + if (!VOID_TYPE_P (TREE_TYPE (arg))) + cost += estimate_move_cost (TREE_TYPE (arg)); } } @@ -3657,6 +3664,10 @@ optimize_inline_calls (tree fn) number_blocks (fn); fold_cond_expr_cond (); + delete_unreachable_blocks_update_callgraph (&id); +#ifdef ENABLE_CHECKING + verify_cgraph_node (id.dst_node); +#endif /* It would be nice to check SSA/CFG/statement consistency here, but it is not possible yet - the IPA passes might make various functions to not |