aboutsummaryrefslogtreecommitdiff
path: root/gcc/ipa-inline.c
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2015-02-05 01:16:11 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2015-02-05 00:16:11 +0000
commitc1eed5a1541acfdfb1107a4400675c2407680ce8 (patch)
tree993d68912f49770cee8eaba7e7943a5872a7dbb5 /gcc/ipa-inline.c
parent73d098df1f48db47e6fb2a840913fc05202378a0 (diff)
downloadgcc-c1eed5a1541acfdfb1107a4400675c2407680ce8.zip
gcc-c1eed5a1541acfdfb1107a4400675c2407680ce8.tar.gz
gcc-c1eed5a1541acfdfb1107a4400675c2407680ce8.tar.bz2
re PR ipa/64686 (ICE: in edge_badness, at ipa-inline.c:912 during Firefox LTO build with enabled checking)
PR ipa/64686 * ipa-inline.c (inline_small_functions): Fix ordering issue between speculation resolution and key updates. * g++.dg/torture/pr64686.C: New testcase. From-SVN: r220429
Diffstat (limited to 'gcc/ipa-inline.c')
-rw-r--r--gcc/ipa-inline.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c
index d9ab56a..287a6dd 100644
--- a/gcc/ipa-inline.c
+++ b/gcc/ipa-inline.c
@@ -1702,6 +1702,7 @@ inline_small_functions (void)
{
bool update = false;
struct cgraph_edge *next;
+ bool has_speculative = false;
if (dump_file)
fprintf (dump_file, "Enqueueing calls in %s/%i.\n",
@@ -1719,12 +1720,17 @@ inline_small_functions (void)
gcc_assert (!edge->aux);
update_edge_key (&edge_heap, edge);
}
- if (edge->speculative && !speculation_useful_p (edge, edge->aux != NULL))
+ if (edge->speculative)
+ has_speculative = true;
+ }
+ if (has_speculative)
+ for (edge = node->callees; edge; edge = next)
+ if (edge->speculative && !speculation_useful_p (edge,
+ edge->aux != NULL))
{
edge->resolve_speculation ();
update = true;
}
- }
if (update)
{
struct cgraph_node *where = node->global.inlined_to