aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2014-07-09 22:00:25 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2014-07-09 20:00:25 +0000
commit958c1d61b1503a70f900a38f6f832ec1beb29d8f (patch)
tree6b183a6e93d590c32cc0c954fc00ea323c4133a7
parentda22f50517faeb3fc185521631e3b86b89bd60ec (diff)
downloadgcc-958c1d61b1503a70f900a38f6f832ec1beb29d8f.zip
gcc-958c1d61b1503a70f900a38f6f832ec1beb29d8f.tar.gz
gcc-958c1d61b1503a70f900a38f6f832ec1beb29d8f.tar.bz2
* ipa-devirt.c (record_node): Walk through aliases.
From-SVN: r212406
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/ipa-devirt.c16
2 files changed, 18 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 96b437f..3437a7c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
2014-07-08 Jan Hubicka <hubicka@ucw.cz>
+ * ipa-devirt.c (record_node): Walk through aliases.
+
+2014-07-08 Jan Hubicka <hubicka@ucw.cz>
+
* lto-streamer-out.c (hash_scc): Avoid quadratic hashing loop.
2014-07-08 Jan Hubicka <hubicka@ucw.cz>
diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c
index 1601b6c..e7add12 100644
--- a/gcc/ipa-devirt.c
+++ b/gcc/ipa-devirt.c
@@ -860,7 +860,8 @@ maybe_record_node (vec <cgraph_node *> &nodes,
bool can_refer,
bool *completep)
{
- struct cgraph_node *target_node;
+ struct cgraph_node *target_node, *alias_target;
+ enum availability avail;
/* cxa_pure_virtual and __builtin_unreachable do not need to be added into
list of targets; the runtime effect of calling them is undefined.
@@ -884,6 +885,17 @@ maybe_record_node (vec <cgraph_node *> &nodes,
target_node = cgraph_get_node (target);
+ /* Preffer alias target over aliases, so we do not get confused by
+ fake duplicates. */
+ if (target_node)
+ {
+ alias_target = cgraph_function_or_thunk_node (target_node, &avail);
+ if (target_node != alias_target
+ && avail >= AVAIL_AVAILABLE
+ && cgraph_function_body_availability (target_node))
+ target_node = alias_target;
+ }
+
/* Method can only be called by polymorphic call if any
of vtables refering to it are alive.
@@ -910,7 +922,7 @@ maybe_record_node (vec <cgraph_node *> &nodes,
{
gcc_assert (!target_node->global.inlined_to);
gcc_assert (symtab_real_symbol_p (target_node));
- if (!pointer_set_insert (inserted, target))
+ if (!pointer_set_insert (inserted, target_node->decl))
{
pointer_set_insert (cached_polymorphic_call_targets,
target_node);