On Thu Jul 9, 2026 at 4:58 PM CEST, Martin Jambor wrote:
> Hello,
>
> On Tue, Jun 23 2026, Josef Melcr wrote:
>> Hi,
>> this patch adds a missing call to edge duplication hooks in
>> cgraph_edge::make_callback.
>>
>> In PR125121, we get an ICE in ipa-sra when compiling with -fno-ipa-cp,
>> because the analysis in ipa-prop runs after sra generates its summaries.
>> Because of the missing call to the hooks, the summaries required by sra
>> don't get copied over for the newly added callback edges, leading to
>> segfaults.  This patch adds the call to the hooks to remedy this.  It
>> also changes some of the initialization logic for summaries for callback
>> edges to make it a little more consistent.
>>
>> Bootstrapped and regtested x86-linux without issues.  Also bootstrapped
>> and regtested with RUNTESTFLAGS="--target_board=unix/-fno-ipa-cp" to
>> check for different problems of the same nature, none found.
>>
>> OK for master and 16 backport?
>>
>> Best regards,
>> Josef
>>
>>      PR 125121
>>
>> gcc/ChangeLog:
>>
>>      * cgraph.cc (cgraph_edge::make_callback): Add missing call to
>>      duplication hooks.
>>      * ipa-prop.cc (init_callback_edge_summary): Remove function.
>>      (ipa_compute_jump_functions_for_edge): Remove call to
>>      init_callback_edge_summary, fix comment.
>>      (ipa_edge_args_sum_t::duplicate): Fix the initialization of jump
>>      functions vector for callback edges.
>
> This is OK for both branches, just please...
>
>>
>> gcc/testsuite/ChangeLog:
>>
>>      * c-c++-common/gomp/pr125121.c: New test.
>>
>> Signed-off-by: Josef Melcr <[email protected]>
>> ---
>>  gcc/cgraph.cc                              |  1 +
>>  gcc/ipa-prop.cc                            | 26 ++++++++++------------
>>  gcc/testsuite/c-c++-common/gomp/pr125121.c | 11 +++++++++
>>  3 files changed, 24 insertions(+), 14 deletions(-)
>>  create mode 100644 gcc/testsuite/c-c++-common/gomp/pr125121.c
>>
>> diff --git a/gcc/cgraph.cc b/gcc/cgraph.cc
>> index 13ea9c34629..4b22cad9f11 100644
>> --- a/gcc/cgraph.cc
>> +++ b/gcc/cgraph.cc
>> @@ -1383,6 +1383,7 @@ cgraph_edge::make_callback (cgraph_node *n2, unsigned 
>> int callback_id)
>>    else
>>      e2->can_throw_external = can_throw_external;
>>    e2->lto_stmt_uid = lto_stmt_uid;
>> +  symtab->call_edge_duplication_hooks (this, e2);
>>    n2->mark_address_taken ();
>>    return e2;
>>  }
>> diff --git a/gcc/ipa-prop.cc b/gcc/ipa-prop.cc
>> index 625a2b25969..dbd26f9453c 100644
>> --- a/gcc/ipa-prop.cc
>> +++ b/gcc/ipa-prop.cc
>> @@ -2480,18 +2480,6 @@ skip_a_safe_conversion_op (tree t)
>>    return t;
>>  }
>>  
>> -/* Initializes ipa_edge_args summary of CBE given its callback-carrying 
>> edge.
>> -   This primarily means allocating the correct amount of jump functions.  */
>> -
>> -static inline void
>> -init_callback_edge_summary (struct cgraph_edge *cbe, tree attr)
>> -{
>> -  ipa_edge_args *cb_args = ipa_edge_args_sum->get_create (cbe);
>> -  size_t jf_vec_length = callback_num_args(attr);
>> -  vec_safe_grow_cleared (cb_args->jump_functions,
>> -                     jf_vec_length, true);
>> -}
>> -
>>  /* Compute jump function for all arguments of callsite CS and insert the
>>     information in the jump_functions array in the ipa_edge_args 
>> corresponding
>>     to this callsite.  */
>> @@ -2631,7 +2619,7 @@ ipa_compute_jump_functions_for_edge (struct 
>> ipa_func_body_info *fbi,
>>                  }
>>  
>>                /* If a callback attribute describing this pointer is found,
>> -                       create a callback edge to the pointee function to
>> +                 create a callback edge to the pointee function to
>>                   allow for further optimizations.  */
>>                if (callback_attr)
>>                  {
>> @@ -2640,7 +2628,6 @@ ipa_compute_jump_functions_for_edge (struct 
>> ipa_func_body_info *fbi,
>>                    unsigned callback_id = n;
>>                    cgraph_edge *cbe
>>                      = cs->make_callback (kernel_node, callback_id);
>> -                  init_callback_edge_summary (cbe, callback_attr);
>>                    callback_edges.safe_push (cbe);
>>                  }
>>              }
>> @@ -5151,6 +5138,17 @@ ipa_edge_args_sum_t::duplicate (cgraph_edge *src, 
>> cgraph_edge *dst,
>>        new_args->jump_functions = NULL;
>>        return;
>>      }
>> +
>> +  if (src->has_callback && dst->callback)
>> +    {
>
> ...assert here that the two edges have the same caller.
>
> Thanks!
>
> Martin

Commited with the assert as r17-2351-g3bbe1a86ccecb1 and
r16-9264-gaa41b0bd7fa07e, thanks :)

Josef

Reply via email to