diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-07-29 09:39:06 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-07-29 09:39:06 +0000 |
commit | 283c87508473e0e2710bf7851babf7c49c70ff4d (patch) | |
tree | 17a1672ffb371dd2e673d37baa24eda5b181647f /gcc/ipa-utils.h | |
parent | 722b598302cbaebca0283a57a29bc48043f18678 (diff) | |
download | gcc-283c87508473e0e2710bf7851babf7c49c70ff4d.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@213152 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ipa-utils.h')
-rw-r--r-- | gcc/ipa-utils.h | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/gcc/ipa-utils.h b/gcc/ipa-utils.h index bb2e0d50d6b..12543048289 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); |