aboutsummaryrefslogtreecommitdiff
path: root/gcc/ipa-utils.h
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2014-07-29 11:39:06 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2014-07-29 09:39:06 +0000
commit3339f0bcb06a145e127e5274e223827a6aeb3cb0 (patch)
tree17a1672ffb371dd2e673d37baa24eda5b181647f /gcc/ipa-utils.h
parentf8a39967a57f8880b7050d53cbf888218626c493 (diff)
downloadgcc-3339f0bcb06a145e127e5274e223827a6aeb3cb0.zip
gcc-3339f0bcb06a145e127e5274e223827a6aeb3cb0.tar.gz
gcc-3339f0bcb06a145e127e5274e223827a6aeb3cb0.tar.bz2
cgraph.c (cgraph_node::create_indirect_edge): Copy speculative data.
* cgraph.c (cgraph_node::create_indirect_edge): Copy speculative data. * cgraph.h (cgraph_indirect_call_info): Add speculative data. * gimple-fold.c (fold_gimple_assign): Fix check for virtual call. * ipa-devirt.c (ipa_dummy_polymorphic_call_context): Update (contains_type_p): Forward declare. (polymorphic_call_target_hasher::hash): Hash speculative info. (polymorphic_call_target_hasher::equal): Compare speculative info. (get_class_context): Handle speuclation. (contains_type_p): Update. (get_polymorphic_call_info_for_decl): Update. (walk_ssa_copies): Break out from ... (get_polymorphic_call_info): ... here; set speculative context before giving up. * ipa-prop.c (ipa_write_indirect_edge_info, ipa_read_indirect_edge_info): Stream speculative context. * ipa-utils.h (ipa_polymorphic_call_context): Add speculative info (SPECULATIVE_OFFSET, SPECULATIVE_OUTER_TYPE, SPECULATIVE_MAYBE_DERIVED_TYPE). (possible_polymorphic_call_targets overriders): Update. (dump_possible_polymorphic_call_targets overriders): Update. (dump_possible_polymorphic_call_target_p overriders): Update. From-SVN: r213152
Diffstat (limited to 'gcc/ipa-utils.h')
-rw-r--r--gcc/ipa-utils.h26
1 files changed, 20 insertions, 6 deletions
diff --git a/gcc/ipa-utils.h b/gcc/ipa-utils.h
index bb2e0d5..1254304 100644
--- a/gcc/ipa-utils.h
+++ b/gcc/ipa-utils.h
@@ -38,13 +38,19 @@ struct ipa_dfs_info {
type inheritance graph. */
struct ipa_polymorphic_call_context {
/* The called object appears in an object of type OUTER_TYPE
- at offset OFFSET. */
+ at offset OFFSET. When information is not 100% reliable, we
+ use SPECULATIVE_OUTER_TYPE and SPECULATIVE_OFFSET. */
HOST_WIDE_INT offset;
+ HOST_WIDE_INT speculative_offset;
tree outer_type;
+ tree speculative_outer_type;
/* True if outer object may be in construction or destruction. */
bool maybe_in_construction;
/* True if outer object may be of derived type. */
bool maybe_derived_type;
+ /* True if speculative outer object may be of derived type. We always
+ speculate that construction does not happen. */
+ bool speculative_maybe_derived_type;
};
/* Context representing "I know nothing". */
@@ -89,6 +95,7 @@ tree get_polymorphic_call_info (tree, tree, tree *,
HOST_WIDE_INT *,
ipa_polymorphic_call_context *,
gimple call = NULL);
+bool get_dynamic_type (tree, ipa_polymorphic_call_context *, tree, gimple);
bool get_polymorphic_call_info_from_invariant (ipa_polymorphic_call_context *,
tree, tree, HOST_WIDE_INT);
bool decl_maybe_in_construction_p (tree, tree, gimple, tree);
@@ -114,9 +121,12 @@ possible_polymorphic_call_targets (struct cgraph_edge *e,
{
gcc_checking_assert (e->indirect_info->polymorphic);
ipa_polymorphic_call_context context = {e->indirect_info->offset,
+ e->indirect_info->speculative_offset,
e->indirect_info->outer_type,
+ e->indirect_info->speculative_outer_type,
e->indirect_info->maybe_in_construction,
- e->indirect_info->maybe_derived_type};
+ e->indirect_info->maybe_derived_type,
+ e->indirect_info->speculative_maybe_derived_type};
return possible_polymorphic_call_targets (e->indirect_info->otr_type,
e->indirect_info->otr_token,
context,
@@ -153,9 +163,12 @@ dump_possible_polymorphic_call_targets (FILE *f, struct cgraph_edge *e)
{
gcc_checking_assert (e->indirect_info->polymorphic);
ipa_polymorphic_call_context context = {e->indirect_info->offset,
+ e->indirect_info->speculative_offset,
e->indirect_info->outer_type,
+ e->indirect_info->speculative_outer_type,
e->indirect_info->maybe_in_construction,
- e->indirect_info->maybe_derived_type};
+ e->indirect_info->maybe_derived_type,
+ e->indirect_info->speculative_maybe_derived_type};
dump_possible_polymorphic_call_targets (f, e->indirect_info->otr_type,
e->indirect_info->otr_token,
context);
@@ -168,10 +181,11 @@ inline bool
possible_polymorphic_call_target_p (struct cgraph_edge *e,
struct cgraph_node *n)
{
- ipa_polymorphic_call_context context = {e->indirect_info->offset,
- e->indirect_info->outer_type,
+ ipa_polymorphic_call_context context = {e->indirect_info->offset, 0,
+ e->indirect_info->outer_type, NULL,
e->indirect_info->maybe_in_construction,
- e->indirect_info->maybe_derived_type};
+ e->indirect_info->maybe_derived_type,
+ false};
return possible_polymorphic_call_target_p (e->indirect_info->otr_type,
e->indirect_info->otr_token,
context, n);