Hi,

On Wed, Dec 03 2025, Josef Melcr wrote:
> Hi,
> this is the third version of this patch (v2:
> https://gcc.gnu.org/pipermail/gcc-patches/2025-December/702508.html).
> I changed set_new_clone_decl_and_node_flags to set local to true iff
> there are no references to the new node, which is not the case for
> callback clones.  The flag has to be set this way as there is no
> way to tell what value will new_node->local have at that point.  I
> removed the callback_called_p method from cgraph_node, as it now serves
> no purpose. Bootstrapped and regtested on x86_64-linux with
> RUNTESTFLAGS="--target_board='unix{-m32}'", it fixes the PR regressions
> and introduces no new regressions.  This patch also fixes 2 tests in
> gcc.dg/guality/vla-1.c when testing with --target_board='unix{-m32}'.  I
> am not quite sure why.
>
> Best regards,
> Josef
>
>       PR ipa/122798
>
> gcc/ChangeLog:
>
>       * cgraph.cc (cgraph_edge::redirect_callee): Set address_taken
>       for new callee.
>       * cgraphclones.cc (set_new_clone_decl_and_node_flags): Set
>       node->local to true iff there are no references to it.
>
> Signed-off-by: Josef Melcr <[email protected]>
> ---
>  gcc/cgraph.cc       | 1 +
>  gcc/cgraphclones.cc | 2 +-
>  2 files changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/gcc/cgraph.cc b/gcc/cgraph.cc
> index 3c21e174943..d6811b19544 100644
> --- a/gcc/cgraph.cc
> +++ b/gcc/cgraph.cc
> @@ -1698,6 +1698,7 @@ cgraph_edge::redirect_callee (cgraph_node *n)
>        new_ref->lto_stmt_uid = lto_stmt_uid;
>        if (!old_callee->referred_to_p ())
>       old_callee->address_taken = 0;
> +      n->mark_address_taken ();
>      }
>  
>    if (!inline_failed)
> diff --git a/gcc/cgraphclones.cc b/gcc/cgraphclones.cc
> index 49f0e58fa1e..276dd525536 100644
> --- a/gcc/cgraphclones.cc
> +++ b/gcc/cgraphclones.cc
> @@ -176,7 +176,7 @@ set_new_clone_decl_and_node_flags (cgraph_node *new_node)
>    DECL_IS_REPLACEABLE_OPERATOR (new_node->decl) = 0;
>  
>    new_node->externally_visible = 0;
> -  new_node->local = 1;
> +  new_node->local = !new_node->referred_to_p ();

reading the source of symtab_node::referred_to_p I'm afraid its name is
a bit confusing, it also returns true if the function has any caller and
so is probably not the right predicate here.

So I believe that you want to use just the first test in that function,
specifically:

  new_node->local = !new_node->iterate_referring (0, ref);

OK with that change (assuming it fixes the bug).

Or we can add another parameter to referred_to_p to specify that we are
really only interested in references. I guess that the use of
referred_to_p in cgraph_edge::redirect_callee is the same case.

Thanks,

Martin

Reply via email to