ipa-icf-gimple.c (func_checker::compare_operand): Fix handling of OBJ_TYPE_REF.
authorJan Hubicka <hubicka@ucw.cz>
Sun, 1 Mar 2015 01:10:32 +0000 (02:10 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sun, 1 Mar 2015 01:10:32 +0000 (01:10 +0000)
* ipa-icf-gimple.c (func_checker::compare_operand): Fix handling
of OBJ_TYPE_REF.

From-SVN: r221086

gcc/ChangeLog
gcc/ipa-icf-gimple.c

index 1b4b17dea95477a51f1263f738479ccc76cddb6c..b47008e9750aa00afacec123e438d08660a75957 100644 (file)
@@ -1,3 +1,8 @@
+2015-02-28  Jan Hubicka  <hubicka@ucw.cz>
+
+       * ipa-icf-gimple.c (func_checker::compare_operand): Fix handling
+       of OBJ_TYPE_REF.
+
 2015-02-28  Jan Hubicka  <hubicka@ucw.cz>
 
        * ipa-icf.c (sem_function::merge): Fix handling of COMDAT.
index cbeb7952ca10d86f5877f848671b6b9c0796d6e0..18631730b69cbe4540a7de746bdd24c35b11e263 100644 (file)
@@ -448,18 +448,23 @@ func_checker::compare_operand (tree t1, tree t2)
     /* Virtual table call.  */
     case OBJ_TYPE_REF:
       {
-       x1 = TREE_OPERAND (t1, 0);
-       x2 = TREE_OPERAND (t2, 0);
-       y1 = TREE_OPERAND (t1, 1);
-       y2 = TREE_OPERAND (t2, 1);
-       z1 = TREE_OPERAND (t1, 2);
-       z2 = TREE_OPERAND (t2, 2);
-
-       ret = compare_ssa_name (x1, x2)
-             && compare_operand (y1, y2)
-             && compare_cst_or_decl (z1, z2);
-
-       return return_with_debug (ret);
+       if (!compare_ssa_name (OBJ_TYPE_REF_EXPR (t1), OBJ_TYPE_REF_EXPR (t2)))
+         return return_false ();
+       if (opt_for_fn (m_source_func_decl, flag_devirtualize)
+           && virtual_method_call_p (t1))
+         {
+           if (tree_to_uhwi (OBJ_TYPE_REF_TOKEN (t1))
+               != tree_to_uhwi (OBJ_TYPE_REF_TOKEN (t2)))
+             return return_false_with_msg ("OBJ_TYPE_REF token mismatch");
+           if (!types_same_for_odr (obj_type_ref_class (t1),
+                                    obj_type_ref_class (t2)))
+             return return_false_with_msg ("OBJ_TYPE_REF OTR type mismatch");
+           if (!compare_ssa_name (OBJ_TYPE_REF_OBJECT (t1),
+                                  OBJ_TYPE_REF_OBJECT (t2)))
+             return return_false_with_msg ("OBJ_TYPE_REF object mismatch");
+         }
+
+       return return_with_debug (true);
       }
     case IMAGPART_EXPR:
     case REALPART_EXPR: