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-transform.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-transform.c')
-rw-r--r-- | gcc/ipa-inline-transform.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/gcc/ipa-inline-transform.c b/gcc/ipa-inline-transform.c index f966fb0..759617b 100644 --- a/gcc/ipa-inline-transform.c +++ b/gcc/ipa-inline-transform.c @@ -338,6 +338,63 @@ inline_call (struct cgraph_edge *e, bool update_original, DECL_FUNCTION_SPECIFIC_OPTIMIZATION (to->decl) = build_optimization_node (&opts); } + inline_summary *caller_info = inline_summaries->get (to); + inline_summary *callee_info = inline_summaries->get (callee); + if (!caller_info->fp_expressions && callee_info->fp_expressions) + { + caller_info->fp_expressions = true; + if (opt_for_fn (callee->decl, flag_rounding_math) + != opt_for_fn (to->decl, flag_rounding_math) + || opt_for_fn (callee->decl, flag_trapping_math) + != opt_for_fn (to->decl, flag_trapping_math) + || opt_for_fn (callee->decl, flag_unsafe_math_optimizations) + != opt_for_fn (to->decl, flag_unsafe_math_optimizations) + || opt_for_fn (callee->decl, flag_finite_math_only) + != opt_for_fn (to->decl, flag_finite_math_only) + || opt_for_fn (callee->decl, flag_signaling_nans) + != opt_for_fn (to->decl, flag_signaling_nans) + || opt_for_fn (callee->decl, flag_cx_limited_range) + != opt_for_fn (to->decl, flag_cx_limited_range) + || opt_for_fn (callee->decl, flag_signed_zeros) + != opt_for_fn (to->decl, flag_signed_zeros) + || opt_for_fn (callee->decl, flag_associative_math) + != opt_for_fn (to->decl, flag_associative_math) + || opt_for_fn (callee->decl, flag_reciprocal_math) + != opt_for_fn (to->decl, flag_reciprocal_math) + || opt_for_fn (callee->decl, flag_errno_math) + != opt_for_fn (to->decl, flag_errno_math)) + { + struct gcc_options opts = global_options; + + cl_optimization_restore (&opts, opts_for_fn (to->decl)); + opts.x_flag_rounding_math + = opt_for_fn (callee->decl, flag_rounding_math); + opts.x_flag_trapping_math + = opt_for_fn (callee->decl, flag_trapping_math); + opts.x_flag_unsafe_math_optimizations + = opt_for_fn (callee->decl, flag_unsafe_math_optimizations); + opts.x_flag_finite_math_only + = opt_for_fn (callee->decl, flag_finite_math_only); + opts.x_flag_signaling_nans + = opt_for_fn (callee->decl, flag_signaling_nans); + opts.x_flag_cx_limited_range + = opt_for_fn (callee->decl, flag_cx_limited_range); + opts.x_flag_signed_zeros + = opt_for_fn (callee->decl, flag_signed_zeros); + opts.x_flag_associative_math + = opt_for_fn (callee->decl, flag_associative_math); + opts.x_flag_reciprocal_math + = opt_for_fn (callee->decl, flag_reciprocal_math); + opts.x_flag_errno_math + = opt_for_fn (callee->decl, flag_errno_math); + if (dump_file) + fprintf (dump_file, "Copying FP flags from %s:%i to %s:%i\n", + callee->name (), callee->order, to->name (), to->order); + build_optimization_node (&opts); + DECL_FUNCTION_SPECIFIC_OPTIMIZATION (to->decl) + = build_optimization_node (&opts); + } + } /* If aliases are involved, redirect edge to the actual destination and possibly remove the aliases. */ |