On Tue, 28 Mar 2023, Richard Biener wrote:

> When adjusting calls to reflect instrumentation we failed to handle
> calls to aliases since they appear to have no body.  Instead resort
> to symtab node availability.  The patch also avoids touching
> internal function calls in a more obvious way (builtins might
> have a body available).
> 
> profiledbootstrap & regtest running on x86_64-unknown-linux-gnu.
> 
> Honza - does this look OK?

Honza - ping!

>       PR tree-optimization/109304
>       * tree-profile.cc (tree_profiling): Use symtab node
>       availability to decide whether to skip adjusting calls.
>       Do not adjust calls to internal functions.
> 
>       * gcc.dg/pr109304.c: New testcase.
> ---
>  gcc/testsuite/gcc.dg/pr109304.c | 12 ++++++++++++
>  gcc/tree-profile.cc             |  9 ++++++---
>  2 files changed, 18 insertions(+), 3 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.dg/pr109304.c
> 
> diff --git a/gcc/testsuite/gcc.dg/pr109304.c b/gcc/testsuite/gcc.dg/pr109304.c
> new file mode 100644
> index 00000000000..d435b04d4d5
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr109304.c
> @@ -0,0 +1,12 @@
> +/* { dg-do compile } */
> +/* { dg-require-profiling "-fprofile-generate" } */
> +/* { dg-require-effective-target fpic } */
> +/* { dg-options "-O3 -fprofile-generate -fPIC -fno-semantic-interposition" } 
> */
> +
> +int PyUnicode_FindChar_i;
> +int PyUnicode_FindChar()
> +{
> +  while (PyUnicode_FindChar_i)
> +    if (PyUnicode_FindChar())
> +      break;
> +}
> diff --git a/gcc/tree-profile.cc b/gcc/tree-profile.cc
> index 6f9a43e4bd5..da300d5f9e8 100644
> --- a/gcc/tree-profile.cc
> +++ b/gcc/tree-profile.cc
> @@ -808,7 +808,7 @@ tree_profiling (void)
>        {
>       if (!gimple_has_body_p (node->decl)
>           || !(!node->clone_of
> -         || node->decl != node->clone_of->decl))
> +              || node->decl != node->clone_of->decl))
>         continue;
>  
>       /* Don't profile functions produced for builtin stuff.  */
> @@ -842,12 +842,15 @@ tree_profiling (void)
>           for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
>             {
>               gcall *call = dyn_cast <gcall *> (gsi_stmt (gsi));
> -             if (!call)
> +             if (!call || gimple_call_internal_p (call))
>                 continue;
>  
>               /* We do not clear pure/const on decls without body.  */
>               tree fndecl = gimple_call_fndecl (call);
> -             if (fndecl && !gimple_has_body_p (fndecl))
> +             cgraph_node *callee;
> +             if (fndecl
> +                 && (callee = cgraph_node::get (fndecl))
> +                 && callee->get_availability (node) == AVAIL_NOT_AVAILABLE)
>                 continue;
>  
>               /* Drop the const attribute from the call type (the pure
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg,
Germany; GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman;
HRB 36809 (AG Nuernberg)

Reply via email to