diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2014-07-09 22:00:25 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2014-07-09 20:00:25 +0000 |
commit | 958c1d61b1503a70f900a38f6f832ec1beb29d8f (patch) | |
tree | 6b183a6e93d590c32cc0c954fc00ea323c4133a7 | |
parent | da22f50517faeb3fc185521631e3b86b89bd60ec (diff) | |
download | gcc-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/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/ipa-devirt.c | 16 |
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); |