diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2016-05-02 18:55:56 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2016-05-02 16:55:56 +0000 |
commit | 818b88a7a1be36183bc4bbc24535329389d6178e (patch) | |
tree | 0c1f84b05ac0062b33430a17eb812449e210f06b /gcc/ipa-inline-analysis.c | |
parent | dd77684f05433afcba15743ba1e2445804f9ac9f (diff) | |
download | gcc-818b88a7a1be36183bc4bbc24535329389d6178e.zip gcc-818b88a7a1be36183bc4bbc24535329389d6178e.tar.gz gcc-818b88a7a1be36183bc4bbc24535329389d6178e.tar.bz2 |
ipa-inline-analysis.c (reset_inline_summary): Clear fp_expressions
* ipa-inline-analysis.c (reset_inline_summary): Clear fp_expressions
(dump_inline_summary): Dump it.
(fp_expression_p): New predicate.
(estimate_function_body_sizes): Use it.
(inline_merge_summary): Merge fp_expressions.
(inline_read_section): Read fp_expressions.
(inline_write_summary): Write fp_expressions.
* ipa-inline.c (can_inline_edge_p): Permit inlining across fp math
codegen boundary if either caller or callee is !fp_expressions.
* ipa-inline.h (inline_summary): Add fp_expressions.
* ipa-inline-transform.c (inline_call): When inlining !fp_expressions
to fp_expressions be sure the fp generation flags are updated.
* gcc.dg/ipa/inline-8.c: New testcase.
From-SVN: r235766
Diffstat (limited to 'gcc/ipa-inline-analysis.c')
-rw-r--r-- | gcc/ipa-inline-analysis.c | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c index f8ca825..a2f3128 100644 --- a/gcc/ipa-inline-analysis.c +++ b/gcc/ipa-inline-analysis.c @@ -850,7 +850,8 @@ evaluate_conditions_for_known_args (struct cgraph_node *node, if (known_aggs.exists ()) { agg = known_aggs[c->operand_num]; - val = ipa_find_agg_cst_for_param (agg, c->offset, c->by_ref); + val = ipa_find_agg_cst_for_param (agg, known_vals[c->operand_num], + c->offset, c->by_ref); } else val = NULL_TREE; @@ -1069,6 +1070,7 @@ reset_inline_summary (struct cgraph_node *node, reset_inline_edge_summary (e); for (e = node->indirect_calls; e; e = e->next_callee) reset_inline_edge_summary (e); + info->fp_expressions = false; } /* Hook that is called by cgraph.c when a node is removed. */ @@ -1423,6 +1425,8 @@ dump_inline_summary (FILE *f, struct cgraph_node *node) fprintf (f, " inlinable"); if (s->contains_cilk_spawn) fprintf (f, " contains_cilk_spawn"); + if (s->fp_expressions) + fprintf (f, " fp_expression"); fprintf (f, "\n self time: %i\n", s->self_time); fprintf (f, " global time: %i\n", s->time); fprintf (f, " self size: %i\n", s->self_size); @@ -2459,6 +2463,21 @@ clobber_only_eh_bb_p (basic_block bb, bool need_eh = true) return true; } +/* Return true if STMT compute a floating point expression that may be affected + by -ffast-math and similar flags. */ + +static bool +fp_expression_p (gimple *stmt) +{ + ssa_op_iter i; + tree op; + + FOR_EACH_SSA_TREE_OPERAND (op, stmt, i, SSA_OP_DEF|SSA_OP_USE) + if (FLOAT_TYPE_P (TREE_TYPE (op))) + return true; + return false; +} + /* Compute function body size parameters for NODE. When EARLY is true, we compute only simple summaries without non-trivial predicates to drive the early inliner. */ @@ -2733,6 +2752,13 @@ estimate_function_body_sizes (struct cgraph_node *node, bool early) this_time * (2 - prob), &p); } + if (!info->fp_expressions && fp_expression_p (stmt)) + { + info->fp_expressions = true; + if (dump_file) + fprintf (dump_file, " fp_expression set\n"); + } + gcc_assert (time >= 0); gcc_assert (size >= 0); } @@ -3577,6 +3603,8 @@ inline_merge_summary (struct cgraph_edge *edge) else toplev_predicate = true_predicate (); + info->fp_expressions |= callee_info->fp_expressions; + if (callee_info->conds) evaluate_properties_for_edge (edge, true, &clause, NULL, NULL, NULL); if (ipa_node_params_sum && callee_info->conds) @@ -4229,6 +4257,7 @@ inline_read_section (struct lto_file_decl_data *file_data, const char *data, bp = streamer_read_bitpack (&ib); info->inlinable = bp_unpack_value (&bp, 1); info->contains_cilk_spawn = bp_unpack_value (&bp, 1); + info->fp_expressions = bp_unpack_value (&bp, 1); count2 = streamer_read_uhwi (&ib); gcc_assert (!info->conds); @@ -4395,6 +4424,7 @@ inline_write_summary (void) bp = bitpack_create (ob->main_stream); bp_pack_value (&bp, info->inlinable, 1); bp_pack_value (&bp, info->contains_cilk_spawn, 1); + bp_pack_value (&bp, info->fp_expressions, 1); streamer_write_bitpack (&bp); streamer_write_uhwi (ob, vec_safe_length (info->conds)); for (i = 0; vec_safe_iterate (info->conds, i, &c); i++) |