aboutsummaryrefslogtreecommitdiff
path: root/gcc/ipa-inline.h
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2017-05-22 17:36:02 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2017-05-22 15:36:02 +0000
commit27d020cf7db55e3cc9517a8bc79e14644f54bd5a (patch)
treef02308bf85443002d40f67dc87ac9d427ff80254 /gcc/ipa-inline.h
parentb7cb2251a32e7af51c5edf97cbf118d5c2b6dd51 (diff)
downloadgcc-27d020cf7db55e3cc9517a8bc79e14644f54bd5a.zip
gcc-27d020cf7db55e3cc9517a8bc79e14644f54bd5a.tar.gz
gcc-27d020cf7db55e3cc9517a8bc79e14644f54bd5a.tar.bz2
Makefile.in: Add ipa-fnsummary.o and ipa-fnsummary.h
* Makefile.in: Add ipa-fnsummary.o and ipa-fnsummary.h * auto-profile.c: Replace ipa-inline.h by ipa-fnsummary.h * cgraph.c: Likewise. * cgraphunit.c: Likewise. * gengtype.c: Likewise. * ipa-cp.c: Likewise. * ipa-devirt.c: Likewise. * ipa-icf.c: Likewise. * ipa-predicate.c: Likewise. * ipa-profile.c: Likewise. * ipa-prop.c: Likewise. * ipa-split.c: Likewise. * ipa.c: Likewise. * ipa-inline-analysis.c (inline_summaries, ipa_call_summaries, edge_predicate_pool, dump_inline_hints, inline_summary::account_size_time, redirect_to_unreachable, edge_set_predicate, set_hint_predicate, evaluate_conditions_for_known_args, evaluate_properties_for_edge, inline_summary_alloc, ipa_call_summary::reset, inline_summary::reset, inline_summary_t::remove, remap_hint_predicate_after_duplication, inline_summary_t::duplicate, ipa_call_summary_t::duplicate, ipa_call_summary_t::remove, initialize_growth_caches, free_growth_caches, dump_ipa_call_summary, dump_inline_summary, debug_inline_summary, dump_inline_summaries, initialize_inline_failed, mark_modified, unmodified_parm_1, unmodified_parm, unmodified_parm_or_parm_agg_item, eliminated_by_inlining_prob, set_cond_stmt_execution_predicate, set_switch_stmt_execution_predicate, compute_bb_predicates, will_be_nonconstant_expr_predicate, will_be_nonconstant_predicate, record_modified_bb_info, get_minimal_bb, record_modified, param_change_prob, phi_result_unknown_predicate, predicate_for_phi_result, array_index_predicate, clobber_only_eh_bb_p, fp_expression_p, estimate_function_body_sizes, compute_inline_parameters, compute_inline_parameters_for_curren, pass_data_inline_parameters, estimate_node_size_and_time, estimate_ipcp_clone_size_and_time, inline_update_callee_summaries, remap_edge_change_prob, remap_edge_summaries, remap_hint_predicate, inline_merge_summary, inline_update_overall_summary, inline_indirect_intraprocedural_analysis, inline_analyze_function, inline_summary_t::insert, inline_generate_summary, read_ipa_call_summary, inline_read_section, inline_read_summary, write_ipa_call_summary, inline_write_summary, inline_free_summary): Move to ipa-fnsummary.h (predicate_t): Remove. * ipa-fnsummary.c: New file. * ipa-inline.h: Do not include sreal.h and ipa-predicate.h (enum inline_hints_vals, inline_hints, agg_position_info, INLINE_SIZE_SCALE, size_time_entry, inline_summary, inline_summary_t, inline_summaries, ipa_call_summary, ipa_call_summary_t, ipa_call_summaries, debug_inline_summary, dump_inline_summaries, dump_inline_summary, dump_inline_hints, inline_generate_summary, inline_read_summary, inline_write_summary, inline_free_summary, inline_analyze_function, initialize_inline_failed, inline_merge_summary, inline_update_overall_summary, compute_inline_parameters): Move to ipa-fnsummary.h * ipa-fnsummary.h: New file. * ipa-inline-transform.h: Include ipa-inline.h. * ipa-inline.c: LIkewise. * lto.c: Replace ipa-inline.h by ipa-fnsummary.h * lto-partition.c: Replace ipa-inline.h by ipa-fnsummary.h From-SVN: r248336
Diffstat (limited to 'gcc/ipa-inline.h')
-rw-r--r--gcc/ipa-inline.h222
1 files changed, 2 insertions, 220 deletions
diff --git a/gcc/ipa-inline.h b/gcc/ipa-inline.h
index 675e975..d9b8611 100644
--- a/gcc/ipa-inline.h
+++ b/gcc/ipa-inline.h
@@ -21,211 +21,6 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_IPA_INLINE_H
#define GCC_IPA_INLINE_H
-#include "sreal.h"
-#include "ipa-predicate.h"
-
-
-/* Inline hints are reasons why inline heuristics should preffer inlining given
- function. They are represtented as bitmap of the following values. */
-enum inline_hints_vals {
- /* When inlining turns indirect call into a direct call,
- it is good idea to do so. */
- INLINE_HINT_indirect_call = 1,
- /* Inlining may make loop iterations or loop stride known. It is good idea
- to do so because it enables loop optimizatoins. */
- INLINE_HINT_loop_iterations = 2,
- INLINE_HINT_loop_stride = 4,
- /* Inlining within same strongly connected component of callgraph is often
- a loss due to increased stack frame usage and prologue setup costs. */
- INLINE_HINT_same_scc = 8,
- /* Inlining functions in strongly connected component is not such a great
- win. */
- INLINE_HINT_in_scc = 16,
- /* If function is declared inline by user, it may be good idea to inline
- it. */
- INLINE_HINT_declared_inline = 32,
- /* Programs are usually still organized for non-LTO compilation and thus
- if functions are in different modules, inlining may not be so important.
- */
- INLINE_HINT_cross_module = 64,
- /* If array indexes of loads/stores become known there may be room for
- further optimization. */
- INLINE_HINT_array_index = 128,
- /* We know that the callee is hot by profile. */
- INLINE_HINT_known_hot = 256
-};
-
-typedef int inline_hints;
-
-/* Simple description of whether a memory load or a condition refers to a load
- from an aggregate and if so, how and where from in the aggregate.
- Individual fields have the same meaning like fields with the same name in
- struct condition. */
-
-struct agg_position_info
-{
- HOST_WIDE_INT offset;
- bool agg_contents;
- bool by_ref;
-};
-
-/* Represnetation of function body size and time depending on the inline
- context. We keep simple array of record, every containing of predicate
- and time/size to account.
-
- We keep values scaled up, so fractional sizes can be accounted. */
-#define INLINE_SIZE_SCALE 2
-struct GTY(()) size_time_entry
-{
- /* Predicate for code to be executed. */
- predicate exec_predicate;
- /* Predicate for value to be constant and optimized out in a specialized copy.
- When deciding on specialization this makes it possible to see how much
- the executed code paths will simplify. */
- predicate nonconst_predicate;
- int size;
- sreal GTY((skip)) time;
-};
-
-/* Function inlining information. */
-struct GTY(()) inline_summary
-{
- /* Information about the function body itself. */
-
- /* Estimated stack frame consumption by the function. */
- HOST_WIDE_INT estimated_self_stack_size;
- /* Size of the function body. */
- int self_size;
- /* Minimal size increase after inlining. */
- int min_size;
-
- /* False when there something makes inlining impossible (such as va_arg). */
- unsigned inlinable : 1;
- /* True when function contains cilk spawn (and thus we can not inline
- into it). */
- unsigned contains_cilk_spawn : 1;
- /* True wen there is only one caller of the function before small function
- inlining. */
- unsigned int single_caller : 1;
- /* True if function contains any floating point expressions. */
- unsigned int fp_expressions : 1;
-
- /* Information about function that will result after applying all the
- inline decisions present in the callgraph. Generally kept up to
- date only for functions that are not inline clones. */
-
- /* Estimated stack frame consumption by the function. */
- HOST_WIDE_INT estimated_stack_size;
- /* Expected offset of the stack frame of inlined function. */
- HOST_WIDE_INT stack_frame_offset;
- /* Estimated size of the function after inlining. */
- sreal GTY((skip)) time;
- int size;
-
- /* Conditional size/time information. The summaries are being
- merged during inlining. */
- conditions conds;
- vec<size_time_entry, va_gc> *size_time_table;
-
- /* Predicate on when some loop in the function becomes to have known
- bounds. */
- predicate * GTY((skip)) loop_iterations;
- /* Predicate on when some loop in the function becomes to have known
- stride. */
- predicate * GTY((skip)) loop_stride;
- /* Predicate on when some array indexes become constants. */
- predicate * GTY((skip)) array_index;
- /* Estimated growth for inlining all copies of the function before start
- of small functions inlining.
- This value will get out of date as the callers are duplicated, but
- using up-to-date value in the badness metric mean a lot of extra
- expenses. */
- int growth;
- /* Number of SCC on the beginning of inlining process. */
- int scc_no;
-
- /* Keep all field empty so summary dumping works during its computation.
- This is useful for debugging. */
- inline_summary ()
- : estimated_self_stack_size (0), self_size (0), min_size (0),
- inlinable (false), contains_cilk_spawn (false), single_caller (false),
- fp_expressions (false), estimated_stack_size (false),
- stack_frame_offset (false), time (0), size (0), conds (NULL),
- size_time_table (NULL), loop_iterations (NULL), loop_stride (NULL),
- array_index (NULL), growth (0), scc_no (0)
- {
- }
-
- /* Record time and size under given predicates. */
- void account_size_time (int, sreal, const predicate &, const predicate &);
-
- /* Reset inline summary to empty state. */
- void reset (struct cgraph_node *node);
-};
-
-class GTY((user)) inline_summary_t: public function_summary <inline_summary *>
-{
-public:
- inline_summary_t (symbol_table *symtab, bool ggc):
- function_summary <inline_summary *> (symtab, ggc) {}
-
- static inline_summary_t *create_ggc (symbol_table *symtab)
- {
- struct inline_summary_t *summary = new (ggc_alloc <inline_summary_t> ())
- inline_summary_t(symtab, true);
- summary->disable_insertion_hook ();
- return summary;
- }
-
-
- virtual void insert (cgraph_node *, inline_summary *);
- virtual void remove (cgraph_node *node, inline_summary *);
- virtual void duplicate (cgraph_node *src, cgraph_node *dst,
- inline_summary *src_data, inline_summary *dst_data);
-};
-
-extern GTY(()) function_summary <inline_summary *> *inline_summaries;
-
-/* Information kept about callgraph edges. */
-struct ipa_call_summary
-{
- class predicate *predicate;
- /* Vector indexed by parameters. */
- vec<inline_param_summary> param;
- /* Estimated size and time of the call statement. */
- int call_stmt_size;
- int call_stmt_time;
- /* Depth of loop nest, 0 means no nesting. */
- unsigned int loop_depth;
-
- /* Keep all field empty so summary dumping works during its computation.
- This is useful for debugging. */
- ipa_call_summary ()
- : predicate (NULL), param (vNULL), call_stmt_size (0), call_stmt_time (0),
- loop_depth (0)
- {
- }
-
- /* Reset inline summary to empty state. */
- void reset ();
-};
-
-class ipa_call_summary_t: public call_summary <ipa_call_summary *>
-{
-public:
- ipa_call_summary_t (symbol_table *symtab, bool ggc):
- call_summary <ipa_call_summary *> (symtab, ggc) {}
-
- /* Hook that is called by summary when an edge is duplicated. */
- virtual void remove (cgraph_edge *cs, ipa_call_summary *);
- /* Hook that is called by summary when an edge is duplicated. */
- virtual void duplicate (cgraph_edge *src, cgraph_edge *dst,
- ipa_call_summary *src_data,
- ipa_call_summary *dst_data);
-};
-
-extern call_summary <ipa_call_summary *> *ipa_call_summaries;
-
/* Data we cache about callgraph edges during inlining to avoid expensive
re-computations during the greedy algorithm. */
struct edge_growth_cache_entry
@@ -238,16 +33,6 @@ struct edge_growth_cache_entry
extern vec<edge_growth_cache_entry> edge_growth_cache;
/* In ipa-inline-analysis.c */
-void debug_inline_summary (struct cgraph_node *);
-void dump_inline_summaries (FILE *f);
-void dump_inline_summary (FILE *f, struct cgraph_node *node);
-void dump_inline_hints (FILE *f, inline_hints);
-void inline_generate_summary (void);
-void inline_read_summary (void);
-void inline_write_summary (void);
-void inline_free_summary (void);
-void inline_analyze_function (struct cgraph_node *node);
-void initialize_inline_failed (struct cgraph_edge *);
int estimate_size_after_inlining (struct cgraph_node *, struct cgraph_edge *);
void estimate_ipcp_clone_size_and_time (struct cgraph_node *,
vec<tree>,
@@ -257,15 +42,13 @@ void estimate_ipcp_clone_size_and_time (struct cgraph_node *,
inline_hints *);
int estimate_growth (struct cgraph_node *);
bool growth_likely_positive (struct cgraph_node *, int);
-void inline_merge_summary (struct cgraph_edge *edge);
-void inline_update_overall_summary (struct cgraph_node *node);
int do_estimate_edge_size (struct cgraph_edge *edge);
sreal do_estimate_edge_time (struct cgraph_edge *edge);
inline_hints do_estimate_edge_hints (struct cgraph_edge *edge);
void initialize_growth_caches (void);
void free_growth_caches (void);
-void compute_inline_parameters (struct cgraph_node *, bool);
-bool speculation_useful_p (struct cgraph_edge *e, bool anticipate_inlining);
+
+/* In ipa-inline.c */
unsigned int early_inliner (function *fun);
bool inline_account_function_p (struct cgraph_node *node);
@@ -280,7 +63,6 @@ void clone_inlined_nodes (struct cgraph_edge *e, bool, bool, int *,
extern int ncalls_inlined;
extern int nfunctions_inlined;
-
/* Return estimated size of the inline sequence of EDGE. */
static inline int