aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2009-05-10 17:20:27 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2009-05-10 15:20:27 +0000
commit078c364462f5cb2d20d94a59ab415358531ebe9a (patch)
tree61b85b391f0c78ef701455d729295c995e219fbd
parentea5783ee951110121aa7746e1c54749640f16351 (diff)
downloadgcc-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
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/tree-inline.c19
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