mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-21 00:11:00 +08:00
tree-optimization/109304 - properly handle instrumented aliases
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? 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.
This commit is contained in:
parent
d634e6088f
commit
d0b961b802
12
gcc/testsuite/gcc.dg/pr109304.c
Normal file
12
gcc/testsuite/gcc.dg/pr109304.c
Normal file
@ -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;
|
||||
}
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user