From 48b1474efb32b90b45e4d824f5c670e24e059f0c Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Wed, 15 May 2013 12:39:28 +0200 Subject: [PATCH] ipa-prop.c (ipa_make_edge_direct_to_target): Redirect calls to non-functions to builtin_unreachable. 2013-05-15 Martin Jambor * ipa-prop.c (ipa_make_edge_direct_to_target): Redirect calls to non-functions to builtin_unreachable. * ipa-inline-transform.c (inline_call): Do not assert estimates were correct when new direct edges were discovered. From-SVN: r198926 --- gcc/ChangeLog | 7 +++++++ gcc/ipa-inline-transform.c | 2 +- gcc/ipa-prop.c | 14 ++++++++++---- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c8ef00489e3b..89827172fc0d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2013-05-15 Martin Jambor + + * ipa-prop.c (ipa_make_edge_direct_to_target): Redirect calls to + non-functions to builtin_unreachable. + * ipa-inline-transform.c (inline_call): Do not assert estimates were + correct when new direct edges were discovered. + 2013-05-15 Martin Jambor * ipa-prop.c (ipa_print_node_jump_functions): Print symbol order in diff --git a/gcc/ipa-inline-transform.c b/gcc/ipa-inline-transform.c index cac20fecc3b5..cb819d7cbb25 100644 --- a/gcc/ipa-inline-transform.c +++ b/gcc/ipa-inline-transform.c @@ -260,7 +260,7 @@ inline_call (struct cgraph_edge *e, bool update_original, #ifdef ENABLE_CHECKING /* Verify that estimated growth match real growth. Allow off-by-one error due to INLINE_SIZE_SCALE roudoff errors. */ - gcc_assert (!update_overall_summary || !overall_size + gcc_assert (!update_overall_summary || !overall_size || new_edges_found || abs (estimated_growth - (new_size - old_size)) <= 1 /* FIXME: a hack. Edges with false predicate are accounted wrong, we should remove them from callgraph. */ diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index 9ae3d69b74bd..abf21c98215a 100644 --- a/gcc/ipa-prop.c +++ b/gcc/ipa-prop.c @@ -2200,6 +2200,7 @@ ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target) { struct cgraph_node *callee; struct inline_edge_summary *es = inline_edge_summary (ie); + bool unreachable = false; if (TREE_CODE (target) == ADDR_EXPR) target = TREE_OPERAND (target, 0); @@ -2210,12 +2211,17 @@ ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target) { if (dump_file) fprintf (dump_file, "ipa-prop: Discovered direct call to non-function" - " in %s/%i.\n", + " in %s/%i, making it unreachable.\n", cgraph_node_name (ie->caller), ie->caller->symbol.order); - return NULL; + target = builtin_decl_implicit (BUILT_IN_UNREACHABLE); + callee = cgraph_get_create_node (target); + unreachable = true; } + else + callee = cgraph_get_node (target); } - callee = cgraph_get_node (target); + else + callee = cgraph_get_node (target); /* Because may-edges are not explicitely represented and vtable may be external, we may create the first reference to the object in the unit. */ @@ -2252,7 +2258,7 @@ ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target) - eni_size_weights.call_cost); es->call_stmt_time -= (eni_time_weights.indirect_call_cost - eni_time_weights.call_cost); - if (dump_file) + if (dump_file && !unreachable) { fprintf (dump_file, "ipa-prop: Discovered %s call to a known target " "(%s/%i -> %s/%i), for stmt ", -- 2.47.2