https://gcc.gnu.org/g:9966cbfafb0266e473ab2178b394455846221c91
commit r16-4528-g9966cbfafb0266e473ab2178b394455846221c91 Author: Josef Melcr <[email protected]> Date: Sat Oct 18 12:47:17 2025 +0200 ipa: Delete callback edges when redirecting to unreachable. When a callback-carrying edge is redirected to __builtin_unreachable, the associated callbacks will never get called, so the corresponding callback edges must be deleted, as they no longer reflect the reality. The line in analyze_function_body is an obvious typo I discovered during debugging, so I decided to bundle it in. gcc/ChangeLog: * ipa-fnsummary.cc (redirect_to_unreachable): Purge callback edges when redirecting the carrying edge. (analyze_function_body): Fix typo. Signed-off-by: Josef Melcr <[email protected]> Diff: --- gcc/ipa-fnsummary.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gcc/ipa-fnsummary.cc b/gcc/ipa-fnsummary.cc index e7b81d83fe1a..bf98a4495844 100644 --- a/gcc/ipa-fnsummary.cc +++ b/gcc/ipa-fnsummary.cc @@ -271,6 +271,8 @@ redirect_to_unreachable (struct cgraph_edge *e) es->call_stmt_time = 0; if (callee) callee->remove_symbol_and_inline_clones (); + if (e->has_callback) + e->purge_callback_edges (); return e; } @@ -3119,8 +3121,7 @@ analyze_function_body (struct cgraph_node *node, bool early) for (cbe = edge->first_callback_edge (); cbe; cbe = cbe->next_callback_edge ()) { - ipa_call_summary *es2 = ipa_call_summaries->get (cbe); - es2 = ipa_call_summaries->get_create (cbe); + ipa_call_summary *es2 = ipa_call_summaries->get_create (cbe); ipa_call_summaries->duplicate (edge, cbe, es, es2); /* Unlike speculative edges, callback edges have no real size or time; the call doesn't exist. Reflect that in
