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 ())
          {
-           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");
+             }
          }
       }
 }
-- 
2.34.1

Reply via email to