* ipa-devirt.c (record_node): Walk through aliases.
authorJan Hubicka <hubicka@ucw.cz>
Wed, 9 Jul 2014 20:00:25 +0000 (22:00 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 9 Jul 2014 20:00:25 +0000 (20:00 +0000)
From-SVN: r212406

gcc/ChangeLog
gcc/ipa-devirt.c

index 96b437f..3437a7c 100644 (file)
@@ -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>
index 1601b6c..e7add12 100644 (file)
@@ -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);