]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* gimple-fold.c (gimple_extract_devirt_binfo_from_cst): Add new
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Aug 2013 12:38:04 +0000 (12:38 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 16 Aug 2013 12:38:04 +0000 (12:38 +0000)
arugment expected_type.
(gimple_fold_call): Use it.
* gimple.h (gimple_extract_devirt_binfo_from_cst): Update prototype.
* ipa-cp.c (ipa_get_indirect_edge_target_1): Update.
* ipa-prop.c (ipa_analyze_virtual_call_uses): Use
obj_type_ref_class.
(try_make_edge_direct_virtual_call): Likewise.
* tree.c (obj_type_ref_class): New.
* tree.h (obj_type_ref_class): Use it.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@201789 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/gimple-fold.c
gcc/gimple.h
gcc/ipa-cp.c
gcc/ipa-prop.c
gcc/tree.c
gcc/tree.h

index f9c214c2d73f7983df1d70707418638ed3dd9f1e..0a77efc8a2aaf0f1ec34ccbaa47aa6c4f6c391f0 100644 (file)
@@ -1,3 +1,16 @@
+2013-08-16  Jan Hubicka  <jh@suse.cz>
+
+       * gimple-fold.c (gimple_extract_devirt_binfo_from_cst): Add new
+       arugment expected_type.
+       (gimple_fold_call): Use it.
+       * gimple.h (gimple_extract_devirt_binfo_from_cst): Update prototype.
+       * ipa-cp.c (ipa_get_indirect_edge_target_1): Update.
+       * ipa-prop.c (ipa_analyze_virtual_call_uses): Use
+       obj_type_ref_class.
+       (try_make_edge_direct_virtual_call): Likewise.
+       * tree.c (obj_type_ref_class): New.
+       * tree.h (obj_type_ref_class): Use it.
+
 2013-08-16  Gabriel Dos Reis  <gdr@integrable-solutions.net>
 
        * sched-vis.c (rtl_slim_pp_initialized): Remove.
index 62c71b6843e65b1440a9825dfb36ac204558466d..e9cd9aa2292d9002b8dc2f3dff2c497ba462621e 100644 (file)
@@ -1007,13 +1007,14 @@ gimple_fold_builtin (gimple stmt)
    represented by a declaration (i.e. a global or automatically allocated one)
    or NULL if it cannot be found or is not safe.  CST is expected to be an
    ADDR_EXPR of such object or the function will return NULL.  Currently it is
-   safe to use such binfo only if it has no base binfo (i.e. no ancestors).  */
+   safe to use such binfo only if it has no base binfo (i.e. no ancestors)
+   EXPECTED_TYPE is type of the class virtual belongs to.  */
 
 tree
-gimple_extract_devirt_binfo_from_cst (tree cst)
+gimple_extract_devirt_binfo_from_cst (tree cst, tree expected_type)
 {
   HOST_WIDE_INT offset, size, max_size;
-  tree base, type, expected_type, binfo;
+  tree base, type, binfo;
   bool last_artificial = false;
 
   if (!flag_devirtualize
@@ -1022,7 +1023,6 @@ gimple_extract_devirt_binfo_from_cst (tree cst)
     return NULL_TREE;
 
   cst = TREE_OPERAND (cst, 0);
-  expected_type = TREE_TYPE (cst);
   base = get_ref_base_and_extent (cst, &offset, &size, &max_size);
   type = TREE_TYPE (base);
   if (!DECL_P (base)
@@ -1108,7 +1108,8 @@ gimple_fold_call (gimple_stmt_iterator *gsi, bool inplace)
       else
        {
          tree obj = OBJ_TYPE_REF_OBJECT (callee);
-         tree binfo = gimple_extract_devirt_binfo_from_cst (obj);
+         tree binfo = gimple_extract_devirt_binfo_from_cst
+                (obj, obj_type_ref_class (callee));
          if (binfo)
            {
              HOST_WIDE_INT token
index 8ae07c9ba5d9d78a34140375189e8ea0f8c4c269..b039937035869dcd66fc4fb2b69508fa17917b9c 100644 (file)
@@ -854,7 +854,7 @@ unsigned get_gimple_rhs_num_ops (enum tree_code);
 gimple gimple_alloc_stat (enum gimple_code, unsigned MEM_STAT_DECL);
 const char *gimple_decl_printable_name (tree, int);
 tree gimple_get_virt_method_for_binfo (HOST_WIDE_INT, tree);
-tree gimple_extract_devirt_binfo_from_cst (tree);
+tree gimple_extract_devirt_binfo_from_cst (tree, tree);
 
 /* Returns true iff T is a scalar register variable.  */
 extern bool is_gimple_reg (tree);
index a52bf7f5524cea70767dad659af4231836489c4f..312672cc49f0425d998639eeb745cd36fa1a4e22 100644 (file)
@@ -1541,7 +1541,8 @@ ipa_get_indirect_edge_target_1 (struct cgraph_edge *ie,
   if (TREE_CODE (t) != TREE_BINFO)
     {
       tree binfo;
-      binfo = gimple_extract_devirt_binfo_from_cst (t);
+      binfo = gimple_extract_devirt_binfo_from_cst
+                (t, ie->indirect_info->otr_type);
       if (!binfo)
        return NULL_TREE;
       binfo = get_binfo_at_offset (binfo, anc_offset, otr_type);
index b06f640b3f8727a7651b522b37cf66632c59def9..7cda34637b23ba59ed975c04b398db8224d9ef2d 100644 (file)
@@ -1903,7 +1903,7 @@ ipa_analyze_virtual_call_uses (struct cgraph_node *node,
   ii = cs->indirect_info;
   ii->offset = anc_offset;
   ii->otr_token = tree_low_cst (OBJ_TYPE_REF_TOKEN (target), 1);
-  ii->otr_type = TREE_TYPE (TREE_TYPE (OBJ_TYPE_REF_OBJECT (target)));
+  ii->otr_type = obj_type_ref_class (target);
   ii->polymorphic = 1;
 }
 
@@ -2453,7 +2453,8 @@ try_make_edge_direct_virtual_call (struct cgraph_edge *ie,
 
   if (TREE_CODE (binfo) != TREE_BINFO)
     {
-      binfo = gimple_extract_devirt_binfo_from_cst (binfo);
+      binfo = gimple_extract_devirt_binfo_from_cst
+                (binfo, ie->indirect_info->otr_type);
       if (!binfo)
         return NULL;
     }
index a1c0deab21e33014ffbdef76242258fcb7ceedbc..9480c7308dac3223ccb9ea8cf985b4dbb86e413f 100644 (file)
@@ -11864,6 +11864,21 @@ types_same_for_odr (tree type1, tree type2)
   return true;
 }
 
+/* REF is OBJ_TYPE_REF, return the class the ref corresponds to.  */
+
+tree
+obj_type_ref_class (tree ref)
+{
+  gcc_checking_assert (TREE_CODE (ref) == OBJ_TYPE_REF);
+  ref = TREE_TYPE (ref);
+  gcc_checking_assert (TREE_CODE (ref) == POINTER_TYPE);
+  ref = TREE_TYPE (ref);
+  gcc_checking_assert (TREE_CODE (ref) == METHOD_TYPE);
+  ref = TREE_VALUE (TYPE_ARG_TYPES (ref));
+  gcc_checking_assert (TREE_CODE (ref) == POINTER_TYPE);
+  return TREE_TYPE (ref);
+}
+
 /* Try to find a base info of BINFO that would have its field decl at offset
    OFFSET within the BINFO type and which is of EXPECTED_TYPE.  If it can be
    found, return, otherwise return NULL_TREE.  */
index 94f112f43d79116ab83c8edf2ca9e59b6e3469d4..c1d8d57e8d543dd721fee9be265395420aec0050 100644 (file)
@@ -5974,6 +5974,7 @@ extern location_t tree_nonartificial_location (tree);
 extern tree block_ultimate_origin (const_tree);
 
 extern tree get_binfo_at_offset (tree, HOST_WIDE_INT, tree);
+extern tree obj_type_ref_class (tree ref);
 extern bool types_same_for_odr (tree type1, tree type2);
 extern tree get_ref_base_and_extent (tree, HOST_WIDE_INT *,
                                     HOST_WIDE_INT *, HOST_WIDE_INT *);