operand_equal_p: add support for OBJ_TYPE_REF.
authorMartin Liska <mliska@suse.cz>
Wed, 30 Oct 2019 11:56:58 +0000 (12:56 +0100)
committerMartin Liska <marxin@gcc.gnu.org>
Wed, 30 Oct 2019 11:56:58 +0000 (11:56 +0000)
2019-10-30  Martin Liska  <mliska@suse.cz>

* fold-const.c (operand_equal_p): Support OBJ_TYPE_REF.
* tree.c (add_expr): Hash parts of OBJ_TYPE_REF.

From-SVN: r277612

gcc/ChangeLog
gcc/fold-const.c
gcc/tree.c

index 89ddfcef05a73d068e5788e829131a5a9ec93c7a..6b32d1ff2bb3e5e77152dda089d6bf0e373f1fe8 100644 (file)
@@ -1,3 +1,8 @@
+2019-10-30  Martin Liska  <mliska@suse.cz>
+
+       * fold-const.c (operand_equal_p): Support OBJ_TYPE_REF.
+       * tree.c (add_expr): Hash parts of OBJ_TYPE_REF.
+
 2019-10-30  Martin Liska  <mliska@suse.cz>
 
        PR lto/91393
index 58b967e48fee11fee98436e14a50b61c4312fa65..8c6e5105ebf597078bc2485452e012a7285a9a66 100644 (file)
@@ -3325,6 +3325,24 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
          flags &= ~OEP_ADDRESS_OF;
          return OP_SAME (1) && OP_SAME (2);
 
+       /* Virtual table call.  */
+       case OBJ_TYPE_REF:
+         {
+           if (!operand_equal_p (OBJ_TYPE_REF_EXPR (arg0),
+                                 OBJ_TYPE_REF_EXPR (arg1), flags))
+             return false;
+           if (tree_to_uhwi (OBJ_TYPE_REF_TOKEN (arg0))
+               != tree_to_uhwi (OBJ_TYPE_REF_TOKEN (arg1)))
+             return false;
+           if (!operand_equal_p (OBJ_TYPE_REF_OBJECT (arg0),
+                                 OBJ_TYPE_REF_OBJECT (arg1), flags))
+             return false;
+           if (!types_same_for_odr (obj_type_ref_class (arg0),
+                                    obj_type_ref_class (arg1)))
+             return false;
+           return true;
+         }
+
        default:
          return false;
        }
index 23fe5bffd3749d346da1bf3e31995784470d2067..75405067ab624b69d56d48047826d8bc38d4d8c4 100644 (file)
@@ -8027,6 +8027,12 @@ add_expr (const_tree t, inchash::hash &hstate, unsigned int flags)
              inchash::add_expr (TARGET_EXPR_SLOT (t), hstate, flags);
              return;
 
+           /* Virtual table call.  */
+           case OBJ_TYPE_REF:
+             inchash::add_expr (OBJ_TYPE_REF_EXPR (t), hstate, flags);
+             inchash::add_expr (OBJ_TYPE_REF_TOKEN (t), hstate, flags);
+             inchash::add_expr (OBJ_TYPE_REF_OBJECT (t), hstate, flags);
+             return;
            default:
              break;
            }