diff options
author | Martin Jambor <mjambor@suse.cz> | 2012-08-11 12:50:24 +0200 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2012-08-11 12:50:24 +0200 |
commit | 8810cc52c9c7af05759a77d5bfe6d46e16b571e8 (patch) | |
tree | 43a439de6e36e3979859d9e70595d7bc11210e62 /gcc/ipa-cp.c | |
parent | ab96cc5b4dd093b769a909e2245da822c4f8e877 (diff) | |
download | gcc-8810cc52c9c7af05759a77d5bfe6d46e16b571e8.zip gcc-8810cc52c9c7af05759a77d5bfe6d46e16b571e8.tar.gz gcc-8810cc52c9c7af05759a77d5bfe6d46e16b571e8.tar.bz2 |
re PR fortran/48636 (Enable more inlining with -O2 and higher)
2012-08-11 Martin Jambor <mjambor@suse.cz>
PR fortran/48636
* ipa-inline.h (condition): New fields offset, agg_contents and by_ref.
* ipa-inline-analysis.c (agg_position_info): New type.
(add_condition): New parameter aggpos, also store agg_contents, by_ref
and offset.
(dump_condition): Also dump aggregate conditions.
(evaluate_conditions_for_known_args): Also handle aggregate
conditions. New parameter known_aggs.
(evaluate_properties_for_edge): Gather known aggregate contents.
(inline_node_duplication_hook): Pass NULL known_aggs to
evaluate_conditions_for_known_args.
(unmodified_parm): Split into unmodified_parm and unmodified_parm_1.
(unmodified_parm_or_parm_agg_item): New function.
(set_cond_stmt_execution_predicate): Handle values passed in
aggregates.
(set_switch_stmt_execution_predicate): Likewise.
(will_be_nonconstant_predicate): Likewise.
(estimate_edge_devirt_benefit): Pass new parameter known_aggs to
ipa_get_indirect_edge_target.
(estimate_calls_size_and_time): New parameter known_aggs, pass it
recrsively to itself and to estimate_edge_devirt_benefit.
(estimate_node_size_and_time): New vector known_aggs, pass it o
functions which need it.
(remap_predicate): New parameter offset_map, use it to remap aggregate
conditions.
(remap_edge_summaries): New parameter offset_map, pass it recursively
to itself and to remap_predicate.
(inline_merge_summary): Also create and populate vector offset_map.
(do_estimate_edge_time): New vector of known aggregate contents,
passed to functions which need it.
(inline_read_section): Stream new fields of condition.
(inline_write_summary): Likewise.
* ipa-cp.c (ipa_get_indirect_edge_target): Also examine the aggregate
contents. Let all local callers pass NULL for known_aggs.
* testsuite/gfortran.dg/pr48636.f90: New test.
From-SVN: r190313
Diffstat (limited to 'gcc/ipa-cp.c')
-rw-r--r-- | gcc/ipa-cp.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index b918470..1f2ea92 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -1084,7 +1084,8 @@ propagate_constants_accross_call (struct cgraph_edge *cs) tree ipa_get_indirect_edge_target (struct cgraph_edge *ie, VEC (tree, heap) *known_vals, - VEC (tree, heap) *known_binfos) + VEC (tree, heap) *known_binfos, + VEC (ipa_agg_jump_function_p, heap) *known_aggs) { int param_index = ie->indirect_info->param_index; HOST_WIDE_INT token, anc_offset; @@ -1096,8 +1097,26 @@ ipa_get_indirect_edge_target (struct cgraph_edge *ie, if (!ie->indirect_info->polymorphic) { - tree t = (VEC_length (tree, known_vals) > (unsigned int) param_index - ? VEC_index (tree, known_vals, param_index) : NULL); + tree t; + + if (ie->indirect_info->agg_contents) + { + if (VEC_length (ipa_agg_jump_function_p, known_aggs) + > (unsigned int) param_index) + { + struct ipa_agg_jump_function *agg; + agg = VEC_index (ipa_agg_jump_function_p, known_aggs, + param_index); + t = ipa_find_agg_cst_for_param (agg, ie->indirect_info->offset, + ie->indirect_info->by_ref); + } + else + t = NULL; + } + else + t = (VEC_length (tree, known_vals) > (unsigned int) param_index + ? VEC_index (tree, known_vals, param_index) : NULL); + if (t && TREE_CODE (t) == ADDR_EXPR && TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL) @@ -1106,6 +1125,7 @@ ipa_get_indirect_edge_target (struct cgraph_edge *ie, return NULL_TREE; } + gcc_assert (!ie->indirect_info->agg_contents); token = ie->indirect_info->otr_token; anc_offset = ie->indirect_info->offset; otr_type = ie->indirect_info->otr_type; @@ -1156,7 +1176,8 @@ devirtualization_time_bonus (struct cgraph_node *node, struct inline_summary *isummary; tree target; - target = ipa_get_indirect_edge_target (ie, known_csts, known_binfos); + target = ipa_get_indirect_edge_target (ie, known_csts, known_binfos, + NULL); if (!target) continue; @@ -1673,7 +1694,7 @@ ipcp_discover_new_direct_edges (struct cgraph_node *node, tree target; next_ie = ie->next_callee; - target = ipa_get_indirect_edge_target (ie, known_vals, NULL); + target = ipa_get_indirect_edge_target (ie, known_vals, NULL, NULL); if (target) ipa_make_edge_direct_to_target (ie, target); } |