Hi, this patch fixes ICE in inline_small_functions checking consistency of the growth cache. When removing speculation the cache needs to be reset because the frequencies of edges change.
Bootstrapped/regtested x86_64-linux, comitted. Honza PR ipa/64565 * g++.dg/torture/pr64565.C: New testcase. * ipa-inline.c (inline_small_functions): Update callee keys after resolving speculation (inline_small_functions): Always check monotonicity of the queue. Index: testsuite/g++.dg/torture/pr64565.C =================================================================== --- testsuite/g++.dg/torture/pr64565.C (revision 0) +++ testsuite/g++.dg/torture/pr64565.C (revision 0) @@ -0,0 +1,89 @@ +/* { dg-do compile } */ +typedef enum +{ + NS_OK +} nsresult; +struct A +{ + static int kIID; +}; +class B +{ +}; +class C +{ +public: + C (B p1) { m_fn1 (p1, A::kIID); } + void m_fn1 (B, int); +}; +class D; +class F +{ +public: + F (int); +}; +class G +{ +public: + D *operator[](int); +}; +class H +{ + virtual nsresult m_fn2 (); + +public: + void m_fn3 (); +}; +class J : H +{ + G mQueries; + int mLiveUpdate; + nsresult m_fn2 (); +}; +class D +{ +public: + nsresult m_fn4 (int); + void m_fn5 (int); +}; +class I +{ +public: + static I * + m_fn6 () + { + B __trans_tmp_3; + if (!gHistoryService) + C serv = __trans_tmp_3; + } + void m_fn7 (); + static I *gHistoryService; +}; +D *Refresh___trans_tmp_2; +D Refresh___trans_tmp_6, Refresh___trans_tmp_5; +int Refresh_hasDomain; +nsresult +J::m_fn2 () +{ + m_fn3 (); + I history = *I::m_fn6 (); + switch (mLiveUpdate) + { + case 1: + { + mQueries[0]; + F query = 0; + if (Refresh_hasDomain) + return NS_OK; + } + case 0: + { + Refresh___trans_tmp_2 = mQueries[0]; + F query = Refresh___trans_tmp_5.m_fn4 (0); + history.m_fn7 (); + Refresh___trans_tmp_6.m_fn5 (0); + } + case 3: + m_fn2 (); + } +} Index: ipa-inline.c =================================================================== --- ipa-inline.c (revision 219452) +++ ipa-inline.c (working copy) @@ -1626,6 +1626,8 @@ inline_small_functions (void) reset_edge_caches (where); update_caller_keys (&edge_heap, where, updated_nodes, NULL); + update_callee_keys (&edge_heap, where, + updated_nodes); bitmap_clear (updated_nodes); } } @@ -1661,7 +1663,7 @@ inline_small_functions (void) /* Disable checking for profile because roundoff errors may cause slight deviations in the order. */ gcc_assert (max_count || cached_badness == current_badness); - gcc_assert (max_count || current_badness >= badness); + gcc_assert (current_badness >= badness); #else current_badness = edge_badness (edge, false); #endif