diff options
author | Dehao Chen <dehao@google.com> | 2014-10-21 17:59:30 +0000 |
---|---|---|
committer | Dehao Chen <dehao@gcc.gnu.org> | 2014-10-21 17:59:30 +0000 |
commit | be3c16c474629e69c6c4cd6465ffa4b572cc6460 (patch) | |
tree | 2dca135cb3eadb5a684bff2c9f64afbafd4ba80e /gcc/ipa-inline.c | |
parent | 3edf64aa919b9bf725672bd0ad91bfd30c6a31df (diff) | |
download | gcc-be3c16c474629e69c6c4cd6465ffa4b572cc6460.zip gcc-be3c16c474629e69c6c4cd6465ffa4b572cc6460.tar.gz gcc-be3c16c474629e69c6c4cd6465ffa4b572cc6460.tar.bz2 |
Add AutoFDO.
gcc/ChangeLog:
2014-10-21 Dehao Chen <dehao@google.com>
* auto-profile.c: New file.
* auto-profile.h: New file.
* basic-block.h (maybe_hot_count_p): New export func.
(add_working_set): New export func.
* gcov-io.h (GCOV_TAG_AFDO_FILE_NAMES): New tag.
(GCOV_TAG_AFDO_FUNCTION): Likewise.
(GCOV_TAG_AFDO_WORKING_SET): Likewise.
* opts.c (enable_fdo_optimizations): New func.
(common_handle_option): Handle -fauto-profile flag.
* ipa-inline.c (want_early_inline_function_p): Iterative-einline.
(class pass_early_inline): Export early_inliner.
(early_inliner): Likewise.
(pass_early_inline::execute): Likewise.
* ipa-inline.h (early_inliner): Likewise.
* predict.c (maybe_hot_count_p): New export func.
(counts_to_freqs): AutoFDO logic.
(rebuild_frequencies): Likewise.
* tree-profile.c (pass_ipa_tree_profile::gate): Likewise.
* profile.c (add_working_set): New func.
* Makefile.in (auto-profile.o): New object file.
* passes.def (pass_ipa_auto_profile): New pass.
* tree-ssa-live.c (remove_unused_scope_block_p): AutoFDO logic.
* tree-pass.h (make_pass_ipa_auto_profile): New pass.
* toplev.c (compile_file): AutoFDO logic.
* doc/invoke.texi (-fauto-profile): New doc.
* coverage.c (coverage_init): AutoFDO logic.
* common.opt (-fauto-profile): New flag.
* timevar.def (TV_IPA_AUTOFDO): New tag.
* value-prof.c (gimple_alloc_histogram_value): New export func.
(check_ic_target): Likewise.
* value-prof.h (gimple_alloc_histogram_value): Likewise.
(check_ic_target): Likewise.
From-SVN: r216523
Diffstat (limited to 'gcc/ipa-inline.c')
-rw-r--r-- | gcc/ipa-inline.c | 79 |
1 files changed, 47 insertions, 32 deletions
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index e79a4dd8..f0177df 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -122,6 +122,7 @@ along with GCC; see the file COPYING3. If not see #include "ipa-inline.h" #include "ipa-utils.h" #include "sreal.h" +#include "auto-profile.h" #include "cilk.h" #include "builtins.h" @@ -443,6 +444,14 @@ want_early_inline_function_p (struct cgraph_edge *e) if (DECL_DISREGARD_INLINE_LIMITS (callee->decl)) ; + /* For AutoFDO, we need to make sure that before profile annotation, all + hot paths' IR look exactly the same as profiled binary. As a result, + in einliner, we will disregard size limit and inline those callsites + that are: + * inlined in the profiled binary, and + * the cloned callee has enough samples to be considered "hot". */ + else if (flag_auto_profile && afdo_callsite_hot_enough_for_early_inline (e)) + ; else if (!DECL_DECLARED_INLINE_P (callee->decl) && !flag_inline_small_functions) { @@ -2360,39 +2369,8 @@ early_inline_small_functions (struct cgraph_node *node) return inlined; } -/* Do inlining of small functions. Doing so early helps profiling and other - passes to be somewhat more effective and avoids some code duplication in - later real inlining pass for testcases with very many function calls. */ - -namespace { - -const pass_data pass_data_early_inline = -{ - GIMPLE_PASS, /* type */ - "einline", /* name */ - OPTGROUP_INLINE, /* optinfo_flags */ - TV_EARLY_INLINING, /* tv_id */ - PROP_ssa, /* properties_required */ - 0, /* properties_provided */ - 0, /* properties_destroyed */ - 0, /* todo_flags_start */ - 0, /* todo_flags_finish */ -}; - -class pass_early_inline : public gimple_opt_pass -{ -public: - pass_early_inline (gcc::context *ctxt) - : gimple_opt_pass (pass_data_early_inline, ctxt) - {} - - /* opt_pass methods: */ - virtual unsigned int execute (function *); - -}; // class pass_early_inline - unsigned int -pass_early_inline::execute (function *fun) +early_inliner (function *fun) { struct cgraph_node *node = cgraph_node::get (current_function_decl); struct cgraph_edge *edge; @@ -2493,6 +2471,43 @@ pass_early_inline::execute (function *fun) return todo; } +/* Do inlining of small functions. Doing so early helps profiling and other + passes to be somewhat more effective and avoids some code duplication in + later real inlining pass for testcases with very many function calls. */ + +namespace { + +const pass_data pass_data_early_inline = +{ + GIMPLE_PASS, /* type */ + "einline", /* name */ + OPTGROUP_INLINE, /* optinfo_flags */ + TV_EARLY_INLINING, /* tv_id */ + PROP_ssa, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ +}; + +class pass_early_inline : public gimple_opt_pass +{ +public: + pass_early_inline (gcc::context *ctxt) + : gimple_opt_pass (pass_data_early_inline, ctxt) + {} + + /* opt_pass methods: */ + virtual unsigned int execute (function *); + +}; // class pass_early_inline + +unsigned int +pass_early_inline::execute (function *fun) +{ + return early_inliner (fun); +} + } // anon namespace gimple_opt_pass * |