aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2015-03-01 02:10:32 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2015-03-01 01:10:32 +0000
commit4bd5f767e6f29e585f7dc048889baf1ec33357b2 (patch)
tree600fa254df54b044fbc358f14a92640ecd60f828
parentc7a06bc12629ce9c897e3cbf155a475eb7ac6375 (diff)
downloadgcc-4bd5f767e6f29e585f7dc048889baf1ec33357b2.zip
gcc-4bd5f767e6f29e585f7dc048889baf1ec33357b2.tar.gz
gcc-4bd5f767e6f29e585f7dc048889baf1ec33357b2.tar.bz2
ipa-icf-gimple.c (func_checker::compare_operand): Fix handling of OBJ_TYPE_REF.
* ipa-icf-gimple.c (func_checker::compare_operand): Fix handling of OBJ_TYPE_REF. From-SVN: r221086
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/ipa-icf-gimple.c29
2 files changed, 22 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1b4b17d..b47008e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
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.
(sem_variable::merge) Likewise.
diff --git a/gcc/ipa-icf-gimple.c b/gcc/ipa-icf-gimple.c
index cbeb795..1863173 100644
--- a/gcc/ipa-icf-gimple.c
+++ b/gcc/ipa-icf-gimple.c
@@ -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: