aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2013-08-16 14:38:04 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2013-08-16 12:38:04 +0000
commitc49bdb2ee934ab6efddbf9284cba5c76f6f3dd28 (patch)
tree71b7f3809446131bd9d0c013ed500b7b38f3350e /gcc
parent4042dca916ad7f5a99438e37416d4fed2209cc6d (diff)
downloadgcc-c49bdb2ee934ab6efddbf9284cba5c76f6f3dd28.zip
gcc-c49bdb2ee934ab6efddbf9284cba5c76f6f3dd28.tar.gz
gcc-c49bdb2ee934ab6efddbf9284cba5c76f6f3dd28.tar.bz2
gimple-fold.c (gimple_extract_devirt_binfo_from_cst): Add new arugment expected_type.
* 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. From-SVN: r201789
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/gimple-fold.c11
-rw-r--r--gcc/gimple.h2
-rw-r--r--gcc/ipa-cp.c3
-rw-r--r--gcc/ipa-prop.c5
-rw-r--r--gcc/tree.c15
-rw-r--r--gcc/tree.h1
7 files changed, 41 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f9c214c..0a77efc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index 62c71b6..e9cd9aa 100644
--- a/gcc/gimple-fold.c
+++ b/gcc/gimple-fold.c
@@ -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
diff --git a/gcc/gimple.h b/gcc/gimple.h
index 8ae07c9..b039937 100644
--- a/gcc/gimple.h
+++ b/gcc/gimple.h
@@ -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);
diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c
index a52bf7f..312672c 100644
--- a/gcc/ipa-cp.c
+++ b/gcc/ipa-cp.c
@@ -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);
diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
index b06f640..7cda346 100644
--- a/gcc/ipa-prop.c
+++ b/gcc/ipa-prop.c
@@ -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;
}
diff --git a/gcc/tree.c b/gcc/tree.c
index a1c0dea..9480c73 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -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. */
diff --git a/gcc/tree.h b/gcc/tree.h
index 94f112f..c1d8d57 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -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 *);