diff options
author | Martin Jambor <mjambor@suse.cz> | 2019-04-15 10:30:36 +0200 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2019-04-15 10:30:36 +0200 |
commit | 79a18702006d53bc378affcd5dd6c8df7883b58f (patch) | |
tree | 85c9a79521fa8c8bcfe5fbf2005d6f2993a4e3fe /gcc/cgraph.c | |
parent | 887e182f05d64c0cb2a888711d8d6ca1174fe93a (diff) |
Reorganize cgraph_node::clone_of_p
2019-04-15 Martin Jambor <mjambor@suse.cz>
PR ipa/pr89693
* cgraph.c (clone_of_p): Loop over clone chain for each step in
the thunk chain.
testsuite/
* g++.dg/ipa/pr89693.C: New test.
From-SVN: r270364
Diffstat (limited to 'gcc/cgraph.c')
-rw-r--r-- | gcc/cgraph.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 49d80ad1e28..b1b0b4c42d5 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -2977,17 +2977,25 @@ cgraph_node::collect_callers (void) static bool clone_of_p (cgraph_node *node, cgraph_node *node2) { - bool skipped_thunk = false; node = node->ultimate_alias_target (); node2 = node2->ultimate_alias_target (); + if (node2->clone_of == node + || node2->former_clone_of == node->decl) + return true; + + if (!node->thunk.thunk_p && !node->former_thunk_p ()) + { + while (node2 && node->decl != node2->decl) + node2 = node2->clone_of; + return node2 != NULL; + } + /* There are no virtual clones of thunks so check former_clone_of or if we might have skipped thunks because this adjustments are no longer necessary. */ while (node->thunk.thunk_p || node->former_thunk_p ()) { - if (node2->former_clone_of == node->decl) - return true; if (!node->thunk.this_adjusting) return false; /* In case of instrumented expanded thunks, which can have multiple calls @@ -2996,23 +3004,21 @@ clone_of_p (cgraph_node *node, cgraph_node *node2) if (node->callees->next_callee) return true; node = node->callees->callee->ultimate_alias_target (); - skipped_thunk = true; - } - if (skipped_thunk) - { if (!node2->clone.args_to_skip || !bitmap_bit_p (node2->clone.args_to_skip, 0)) return false; if (node2->former_clone_of == node->decl) return true; - else if (!node2->clone_of) - return false; + + cgraph_node *n2 = node2; + while (n2 && node->decl != n2->decl) + n2 = n2->clone_of; + if (n2) + return true; } - while (node2 && node->decl != node2->decl) - node2 = node2->clone_of; - return node2 != NULL; + return false; } /* Verify edge count and frequency. */ |