ipa-cp.c (ipa_get_indirect_edge_target_1): Use can_refer; do not speculate to impossi...
authorJan Hubicka <hubicka@ucw.cz>
Wed, 16 Dec 2015 17:26:20 +0000 (18:26 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 16 Dec 2015 17:26:20 +0000 (17:26 +0000)
* ipa-cp.c (ipa_get_indirect_edge_target_1): Use can_refer; do not
speculate to impossible targets.
* ipa-prop.c (try_make_edge_direct_virtual_call): Likewise.

From-SVN: r231705

gcc/ChangeLog
gcc/ipa-cp.c
gcc/ipa-prop.c

index ee2af1d..323c8d1 100644 (file)
@@ -1,3 +1,9 @@
+2015-12-10  Jan Hubicka  <hubicka@ucw.cz>
+
+       * ipa-cp.c (ipa_get_indirect_edge_target_1): Use can_refer; do not
+       speculate to impossible targets.
+       * ipa-prop.c (try_make_edge_direct_virtual_call): Likewise.
+
 2015-12-16  Aditya Kumar  <aditya.k7@samsung.com>
            Sebastian Pop  <s.pop@samsung.com>
 
index 8087f66..782df71 100644 (file)
@@ -2077,15 +2077,22 @@ ipa_get_indirect_edge_target_1 (struct cgraph_edge *ie,
       unsigned HOST_WIDE_INT offset;
       if (vtable_pointer_value_to_vtable (t, &vtable, &offset))
        {
+         bool can_refer;
          target = gimple_get_virt_method_for_vtable (ie->indirect_info->otr_token,
-                                                     vtable, offset);
-         if (target)
+                                                     vtable, offset, &can_refer);
+         if (can_refer)
            {
-             if ((TREE_CODE (TREE_TYPE (target)) == FUNCTION_TYPE
-                  && DECL_FUNCTION_CODE (target) == BUILT_IN_UNREACHABLE)
+             if (!target
+                 || (TREE_CODE (TREE_TYPE (target)) == FUNCTION_TYPE
+                     && DECL_FUNCTION_CODE (target) == BUILT_IN_UNREACHABLE)
                  || !possible_polymorphic_call_target_p
                       (ie, cgraph_node::get (target)))
-               target = ipa_impossible_devirt_target (ie, target);
+               {
+                 /* Do not speculate builtin_unreachable, it is stupid!  */
+                 if (ie->indirect_info->vptr_changed)
+                   return NULL;
+                 target = ipa_impossible_devirt_target (ie, target);
+               }
               *speculative = ie->indirect_info->vptr_changed;
              if (!*speculative)
                return target;
@@ -2163,7 +2170,11 @@ ipa_get_indirect_edge_target_1 (struct cgraph_edge *ie,
 
   if (target && !possible_polymorphic_call_target_p (ie,
                                                     cgraph_node::get (target)))
-    target = ipa_impossible_devirt_target (ie, target);
+    {
+      if (*speculative)
+       return NULL;
+      target = ipa_impossible_devirt_target (ie, target);
+    }
 
   return target;
 }
index 72c2fed..0ab2427 100644 (file)
@@ -2898,18 +2898,22 @@ try_make_edge_direct_virtual_call (struct cgraph_edge *ie,
                                           true);
       if (t && vtable_pointer_value_to_vtable (t, &vtable, &offset))
        {
+         bool can_refer;
          t = gimple_get_virt_method_for_vtable (ie->indirect_info->otr_token,
-                                                     vtable, offset);
-         if (t)
+                                                vtable, offset, &can_refer);
+         if (can_refer)
            {
-             if ((TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE
-                  && DECL_FUNCTION_CODE (t) == BUILT_IN_UNREACHABLE)
+             if (!t
+                 || (TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE
+                     && DECL_FUNCTION_CODE (t) == BUILT_IN_UNREACHABLE)
                  || !possible_polymorphic_call_target_p
                       (ie, cgraph_node::get (t)))
                {
                  /* Do not speculate builtin_unreachable, it is stupid!  */
                  if (!ie->indirect_info->vptr_changed)
                    target = ipa_impossible_devirt_target (ie, target);
+                 else
+                   target = NULL;
                }
              else
                {