Hello,
On Thu, Aug 20 2026, Kugan Vivekanandarajah wrote:
> Fixes ICE in include/c++/16.0.1/bits/stl_tree.h:2801:5 during IPA inline:
> internal compiler error: verify_cgraph_node failed
> #0 internal_error(char const*, ...)
> .../gcc/diagnostic-global-context.cc:787
> #1 cgraph_node::verify_node()
> .../gcc/cgraph.cc:4499
> #2 symtab_node::verify()
> .../gcc/symtab.cc:1377
> #3 optimize_inline_calls(tree_node*)
> .../gcc/tree-inline.cc:5677
> #4 inline_transform(cgraph_node*)
> .../gcc/ipa-inline-transform.cc:871
> #5 execute_one_ipa_transform_pass
> .../gcc/passes.cc:2336
> #6 execute_all_ipa_transforms(bool)
> .../gcc/passes.cc:2400
> #7 cgraph_node::expand()
> .../gcc/cgraphunit.cc:1867
> #8 cgraph_node::expand()
> .../gcc/cgraphunit.cc:1827
> #9 expand_all_functions
> .../gcc/cgraphunit.cc:2057
> #10 symbol_table::compile()
> .../gcc/cgraphunit.cc:2435
> #11 lto_main()
> .../gcc/lto/lto.cc:694
> adjust_clone_incoming_counts: only combine or increment incoming edge
> counts when the edge count is IPA-visible (ipa_p ()), following the same
> rule already used in update_counts_for_self_gen_clones when scaling
> recursive clone edges (commit 8c6b6adce45a550c52dc35e3df4e0c477f5404fa).
> Rewriting non-IPA edge counts leaves gimple BB frequencies inconsistent
> with the call graph and trips verify_cgraph_node.
>
> gcc/ChangeLog:
>
> 2026-04-16 Kugan Vivekanandarajah <[email protected]>
>
> * ipa-cp.cc (adjust_clone_incoming_counts): Adjust counts only when
> ipa quality.
>
> Regression tested on aarch64-linux-gnu with no new regressions.
> Signed-off-by: Kugan Vivekanandarajah <[email protected]>
> ---
> gcc/ipa-cp.cc | 34 ++++++++++++++++++++++------------
> 1 file changed, 22 insertions(+), 12 deletions(-)
>
> diff --git a/gcc/ipa-cp.cc b/gcc/ipa-cp.cc
> index d5d9709e118..019bec5aedf 100644
> --- a/gcc/ipa-cp.cc
> +++ b/gcc/ipa-cp.cc
> @@ -4620,24 +4620,34 @@ adjust_clone_incoming_counts (cgraph_node *node,
> if (cs->caller->thunk)
> {
> adjust_clone_incoming_counts (cs->caller, desc);
> - profile_count sum = profile_count::zero ();
> - for (cgraph_edge *e = cs->caller->callers; e; e = e->next_caller)
> - if (e->count.initialized_p ())
> - sum += e->count.ipa ();
> - cs->count = cs->count.combine_with_ipa_count (sum);
> + /* Same rationale as commit 8c6b6adce45a550c52dc35e3df4e0c477f5404fa
> + for scaling recursive edges in update_counts_for_self_gen_clones:
> + adjusting non-IPA edge counts here does not update matching gimple
> + BB frequencies and breaks verify_cgraph_node. */
> + if (cs->count.ipa_p ())
> + {
> + profile_count sum = profile_count::zero ();
> + for (cgraph_edge *e = cs->caller->callers; e; e = e->next_caller)
> + if (e->count.initialized_p ())
> + sum += e->count.ipa ();
> + cs->count = cs->count.combine_with_ipa_count (sum);
> + }
> }
> else if (!desc->processed_edges->contains (cs)
> && cs->caller->clone_of == desc->orig
> && cs->count.compatible_p (desc->count))
> {
> - cs->count += desc->count;
> - if (dump_file)
> + if (cs->count.ipa_p ())
since you opted for a nested if...
> {
> - fprintf (dump_file, " Adjusted count of an incoming edge of "
> - "a clone %s -> %s to ", cs->caller->dump_name (),
> - cs->callee->dump_name ());
> - cs->count.dump (dump_file);
> - fprintf (dump_file, "\n");
> + cs->count += desc->count;
> + if (dump_file)
> + {
> + fprintf (dump_file, " Adjusted count of an incoming edge "
> + "of a clone %s -> %s to ", cs->caller->dump_name (),
> + cs->callee->dump_name ());
> + cs->count.dump (dump_file);
> + fprintf (dump_file, "\n");
> + }
...can you please add a dump along the lines of
" Skipping adjustment of the count of an incoming edge of a clone %s ->
%s\n"
in the case where the count is not an ipa_p() and dumping is on?
OK with that change.
Thanks,
Martin