]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ipa-prop.c (ipa_set_jf_known_type): Record always the main variant of the type.
authorJan Hubicka <hubicka@ucw.cz>
Sat, 28 Jun 2014 18:29:32 +0000 (20:29 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sat, 28 Jun 2014 18:29:32 +0000 (18:29 +0000)
* ipa-prop.c (ipa_set_jf_known_type): Record always the main variant
of the type.
(ipa_set_ancestor_jf) Likewise.
(check_stmt_for_type_change): Check that we work on main variant.
(detect_type_change): Look into main variant.
(compute_known_type_jump_func): Check that main variant has BINFO.

From-SVN: r212108

gcc/ChangeLog
gcc/ipa-prop.c

index f5d9983d1d11e562d672bcd703d85aaaffe721d6..75b2816cb4672ab586438a1434098737cf627cec 100644 (file)
@@ -1,3 +1,12 @@
+2014-06-28  Jan Hubicka  <hubicka@ucw.cz>
+
+       * ipa-prop.c (ipa_set_jf_known_type): Record always the main variant
+       of the type.
+       (ipa_set_ancestor_jf) Likewise.
+       (check_stmt_for_type_change): Check that we work on main variant.
+       (detect_type_change): Look into main variant.
+       (compute_known_type_jump_func): Check that main variant has BINFO.
+
 2014-06-28  Jan Hubicka  <hubicka@ucw.cz>
 
        * ipa-devirt.c (set_type_binfo): New function.
index 68efc77851c9dff40825191382c5faaf0bcb1e6f..dab8291dd566532f2f26761c43c9fadb15f7e334 100644 (file)
@@ -438,6 +438,11 @@ static void
 ipa_set_jf_known_type (struct ipa_jump_func *jfunc, HOST_WIDE_INT offset,
                       tree base_type, tree component_type)
 {
+  /* Recording and propagating main variants increases change that types
+     will match.  */
+  base_type = TYPE_MAIN_VARIANT (base_type);
+  component_type = TYPE_MAIN_VARIANT (component_type);
+
   gcc_assert (TREE_CODE (component_type) == RECORD_TYPE
              && TYPE_BINFO (component_type));
   if (!flag_devirtualize)
@@ -529,6 +534,8 @@ ipa_set_ancestor_jf (struct ipa_jump_func *jfunc, HOST_WIDE_INT offset,
 {
   if (!flag_devirtualize)
     type_preserved = false;
+  if (type)
+    type = TYPE_MAIN_VARIANT (type);
   gcc_assert (!type_preserved
              || (TREE_CODE (type) == RECORD_TYPE
                  && TYPE_BINFO (type)
@@ -712,7 +719,9 @@ check_stmt_for_type_change (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef, void *data)
   if (stmt_may_be_vtbl_ptr_store (stmt))
     {
       tree type;
+
       type = extr_type_from_vtbl_ptr_store (stmt, tci);
+      gcc_assert (!type || TYPE_MAIN_VARIANT (type) == type);
       if (tci->type_maybe_changed
          && type != tci->known_current_type)
        tci->multiple_types_encountered = true;
@@ -749,10 +758,12 @@ detect_type_change (tree arg, tree base, tree comp_type, gimple call,
       /* Be sure expected_type is polymorphic.  */
       || !comp_type
       || TREE_CODE (comp_type) != RECORD_TYPE
-      || !TYPE_BINFO (comp_type)
-      || !BINFO_VTABLE (TYPE_BINFO (comp_type)))
+      || !TYPE_BINFO (TYPE_MAIN_VARIANT (comp_type))
+      || !BINFO_VTABLE (TYPE_BINFO (TYPE_MAIN_VARIANT (comp_type))))
     return true;
 
+  comp_type = TYPE_MAIN_VARIANT (comp_type);
+
   /* C++ methods are not allowed to change THIS pointer unless they
      are constructors or destructors.  */
   if (TREE_CODE        (base) == MEM_REF
@@ -1408,8 +1419,8 @@ compute_known_type_jump_func (tree op, struct ipa_jump_func *jfunc,
       /* Be sure expected_type is polymorphic.  */
       || !expected_type
       || TREE_CODE (expected_type) != RECORD_TYPE
-      || !TYPE_BINFO (expected_type)
-      || !BINFO_VTABLE (TYPE_BINFO (expected_type)))
+      || !TYPE_BINFO (TYPE_MAIN_VARIANT (expected_type))
+      || !BINFO_VTABLE (TYPE_BINFO (TYPE_MAIN_VARIANT (expected_type))))
     return;
 
   op = TREE_OPERAND (op, 0);