Hi, the problem here is ipa-prop trying to analyze indirect call that has been already turned to direct. While early opts should optimize this call (and in fact I have approved patch to do so I forgot to apply), we should not ICE in this case.
Fixed thus, bootstrapped/regtested x86_64-linux, will commit it shortly. Honza PR ipa/59265 * g++.dg/torture/pr59265.C: New testcase. * ipa-prop.c (ipa_analyze_call_uses): Do not analyze indirect calls that was already turned into direct calls. Index: testsuite/g++.dg/torture/pr59265.C =================================================================== --- testsuite/g++.dg/torture/pr59265.C (revision 0) +++ testsuite/g++.dg/torture/pr59265.C (revision 0) @@ -0,0 +1,22 @@ +// { dg-do compile } +// { dg-options "-fprofile-use" } + +class A { + int m_fn1() const; + unsigned m_fn2() const; +}; +class B { +public: + virtual void m_fn1(); +}; +class C final : B { + C(); + virtual void m_fn2() { m_fn1(); } +}; +int a; +unsigned A::m_fn2() const { + if (m_fn1()) + return 0; + a = m_fn2(); +} +C::C() {} Index: ipa-prop.c =================================================================== --- ipa-prop.c (revision 205993) +++ ipa-prop.c (working copy) @@ -2024,8 +2024,17 @@ ipa_analyze_call_uses (struct cgraph_nod struct param_analysis_info *parms_ainfo, gimple call) { tree target = gimple_call_fn (call); + struct cgraph_edge *cs; - if (!target) + if (!target + || (TREE_CODE (target) != SSA_NAME + && !virtual_method_call_p (target))) + return; + + /* If we previously turned the call into a direct call, there is + no need to analyze. */ + cs = cgraph_edge (node, call); + if (cs && !cs->indirect_unknown_callee) return; if (TREE_CODE (target) == SSA_NAME) ipa_analyze_indirect_call_uses (node, info, parms_ainfo, call, target);