aboutsummaryrefslogtreecommitdiff
path: root/gcc/ipa-inline.c
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2014-02-20 07:40:07 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2014-02-20 06:40:07 +0000
commitbd936951453c1105710649955568375e67c69d30 (patch)
treeaa5cb062d365b7b66d1c27c29cac928aaa4f40a4 /gcc/ipa-inline.c
parent3c898e1acb4f9c8d43c84d2138fa298de0205c46 (diff)
downloadgcc-bd936951453c1105710649955568375e67c69d30.zip
gcc-bd936951453c1105710649955568375e67c69d30.tar.gz
gcc-bd936951453c1105710649955568375e67c69d30.tar.bz2
re PR middle-end/58555 (Floating point exception in want_inline_self_recursive_call_p)
PR ipa/58555 * ipa-inline-transform.c (clone_inlined_nodes): Add freq_scale parameter specifying the scaling. (inline_call): Update. (want_inline_recursively): Guard division by zero. (recursive_inlining): Update. * ipa-inline.h (clone_inlined_nodes): Update. * testsuite/g++.dg/torture/pr58555.C: New testcase. From-SVN: r207934
Diffstat (limited to 'gcc/ipa-inline.c')
-rw-r--r--gcc/ipa-inline.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
index d304133..f6f97f8 100644
--- a/gcc/ipa-inline.c
+++ b/gcc/ipa-inline.c
@@ -708,6 +708,12 @@ want_inline_self_recursive_call_p (struct cgraph_edge *edge,
if (outer_node->global.inlined_to)
caller_freq = outer_node->callers->frequency;
+ if (!caller_freq)
+ {
+ reason = "function is inlined and unlikely";
+ want_inline = false;
+ }
+
if (!want_inline)
;
/* Inlining of self recursive function into copy of itself within other function
@@ -1385,7 +1391,7 @@ recursive_inlining (struct cgraph_edge *edge,
false, vNULL, true, NULL);
for (e = master_clone->callees; e; e = e->next_callee)
if (!e->inline_failed)
- clone_inlined_nodes (e, true, false, NULL);
+ clone_inlined_nodes (e, true, false, NULL, CGRAPH_FREQ_BASE);
cgraph_redirect_edge_callee (curr, master_clone);
reset_edge_growth_cache (curr);
}