]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ipa-prop.h (ipa_ancestor_jf_data): Update ocmment.
authorJan Hubicka <hubicka@ucw.cz>
Wed, 19 Feb 2014 07:42:06 +0000 (08:42 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Wed, 19 Feb 2014 07:42:06 +0000 (07:42 +0000)
* ipa-prop.h (ipa_ancestor_jf_data): Update ocmment.
* ipa-prop.c (ipa_set_jf_known_type): Return early when
not devirtualizing.
(ipa_set_ancestor_jf): Set type to NULL hwen it is not preserved;
do more sanity checks.
(detect_type_change): Return true when giving up early.
(compute_complex_assign_jump_func): Fix type parameter of
ipa_set_ancestor_jf.
(compute_complex_ancestor_jump_func): Likewise.
(update_jump_functions_after_inlining): Fix updating of
ancestor function.
* ipa-cp.c (ipa_get_jf_ancestor_result): Be ready for type
to be NULL.

From-SVN: r207877

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

index 315691a06b89f6433e460bc2004b96d0f9065c39..c4ea4d375b43b52f7e76aaddb064b80e59efd8cc 100644 (file)
@@ -1,3 +1,19 @@
+2014-02-18  Jan Hubicka  <hubicka@ucw.cz>
+
+       * ipa-prop.h (ipa_ancestor_jf_data): Update ocmment.
+       * ipa-prop.c (ipa_set_jf_known_type): Return early when
+       not devirtualizing.
+       (ipa_set_ancestor_jf): Set type to NULL hwen it is not preserved;
+       do more sanity checks.
+       (detect_type_change): Return true when giving up early.
+       (compute_complex_assign_jump_func): Fix type parameter of
+       ipa_set_ancestor_jf.
+       (compute_complex_ancestor_jump_func): Likewise.
+       (update_jump_functions_after_inlining): Fix updating of
+       ancestor function.
+       * ipa-cp.c (ipa_get_jf_ancestor_result): Be ready for type
+       to be NULL.
+
 2014-02-18  Jan Hubicka  <hubicka@ucw.cz>
 
        * cgraph.c (cgraph_update_edges_for_call_stmt_node): Also remove
index d93b45c106881379fa45dd1d8c9a471bd9e9104d..f7cf7164fe11e0c18c1d3f082eb1f86c68470671 100644 (file)
@@ -798,7 +798,9 @@ ipa_get_jf_ancestor_result (struct ipa_jump_func *jfunc, tree input)
       tree t = TREE_OPERAND (input, 0);
       t = build_ref_for_offset (EXPR_LOCATION (t), t,
                                ipa_get_jf_ancestor_offset (jfunc),
-                               ipa_get_jf_ancestor_type (jfunc), NULL, false);
+                               ipa_get_jf_ancestor_type (jfunc)
+                               ? ipa_get_jf_ancestor_type (jfunc)
+                               : ptr_type_node, NULL, false);
       return build_fold_addr_expr (t);
     }
   else
index 0f293996c67a5df026b368936affa3a67752cb60..133bfc0b7d8a304f90267a4f5d96da565327a782 100644 (file)
@@ -393,6 +393,9 @@ ipa_set_jf_known_type (struct ipa_jump_func *jfunc, HOST_WIDE_INT offset,
 {
   gcc_assert (TREE_CODE (component_type) == RECORD_TYPE
              && TYPE_BINFO (component_type));
+  if (!flag_devirtualize)
+    return;
+  gcc_assert (BINFO_VTABLE (TYPE_BINFO (component_type)));
   jfunc->type = IPA_JF_KNOWN_TYPE;
   jfunc->value.known_type.offset = offset,
   jfunc->value.known_type.base_type = base_type;
@@ -477,10 +480,16 @@ ipa_set_ancestor_jf (struct ipa_jump_func *jfunc, HOST_WIDE_INT offset,
                     tree type, int formal_id, bool agg_preserved,
                     bool type_preserved)
 {
+  if (!flag_devirtualize)
+    type_preserved = false;
+  gcc_assert (!type_preserved
+             || (TREE_CODE (type) == RECORD_TYPE
+                 && TYPE_BINFO (type)
+                 && BINFO_VTABLE (TYPE_BINFO (type))));
   jfunc->type = IPA_JF_ANCESTOR;
   jfunc->value.ancestor.formal_id = formal_id;
   jfunc->value.ancestor.offset = offset;
-  jfunc->value.ancestor.type = type;
+  jfunc->value.ancestor.type = type_preserved ? type : NULL;
   jfunc->value.ancestor.agg_preserved = agg_preserved;
   jfunc->value.ancestor.type_preserved = type_preserved;
 }
@@ -686,7 +695,7 @@ detect_type_change (tree arg, tree base, tree comp_type, gimple call,
       || TREE_CODE (comp_type) != RECORD_TYPE
       || !TYPE_BINFO (comp_type)
       || !BINFO_VTABLE (TYPE_BINFO (comp_type)))
-    return false;
+    return true;
 
   /* C++ methods are not allowed to change THIS pointer unless they
      are constructors or destructors.  */
@@ -1103,7 +1112,8 @@ compute_complex_assign_jump_func (struct ipa_node_params *info,
       bool type_p = !detect_type_change (op1, base, TREE_TYPE (param_type),
                                         call, jfunc, offset);
       if (type_p || jfunc->type == IPA_JF_UNKNOWN)
-       ipa_set_ancestor_jf (jfunc, offset, TREE_TYPE (op1), index,
+       ipa_set_ancestor_jf (jfunc, offset,
+                            type_p ? TREE_TYPE (param_type) : NULL, index,
                             parm_ref_data_pass_through_p (&parms_ainfo[index],
                                                           call, ssa), type_p);
     }
@@ -1236,7 +1246,7 @@ compute_complex_ancestor_jump_func (struct ipa_node_params *info,
     type_p = !detect_type_change (obj, expr, TREE_TYPE (param_type),
                                  call, jfunc, offset);
   if (type_p || jfunc->type == IPA_JF_UNKNOWN)
-    ipa_set_ancestor_jf (jfunc, offset, TREE_TYPE (obj), index,
+    ipa_set_ancestor_jf (jfunc, offset, type_p ? TREE_TYPE (param_type) : NULL, index,
                         parm_ref_data_pass_through_p (&parms_ainfo[index],
                                                       call, parm), type_p);
 }
@@ -2391,7 +2401,7 @@ update_jump_functions_after_inlining (struct cgraph_edge *cs,
                    ipa_set_jf_known_type (dst,
                                           ipa_get_jf_known_type_offset (src),
                                           ipa_get_jf_known_type_base_type (src),
-                                          ipa_get_jf_known_type_base_type (src));
+                                          ipa_get_jf_known_type_component_type (src));
                  else
                    dst->type = IPA_JF_UNKNOWN;
                  break;
index 299627b1394440db67d5d001d57910023e8107f0..8fdd92c14ef789b11b0048578d1af53559d2e8d1 100644 (file)
@@ -130,7 +130,9 @@ struct GTY(()) ipa_ancestor_jf_data
 {
   /* Offset of the field representing the ancestor.  */
   HOST_WIDE_INT offset;
-  /* Type of the result.  */
+  /* Type of the result.
+     When TYPE_PRESERVED is false, TYPE is NULL, since it is only
+     relevant for the devirtualization machinery.  */
   tree type;
   /* Number of the caller's formal parameter being passed.  */
   int formal_id;