diff options
author | Jan Hubicka <jh@suse.cz> | 2011-04-17 16:22:20 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2011-04-17 14:22:20 +0000 |
commit | 4c0f767939eb659b721f9222cf7bdacd0194310b (patch) | |
tree | 437b0b8c6f18f8d396674a0c5a7fe26c430fa602 /gcc/tree-inline.c | |
parent | 51c5169c60be01c229b8637d11283d843bc6e126 (diff) | |
download | gcc-4c0f767939eb659b721f9222cf7bdacd0194310b.zip gcc-4c0f767939eb659b721f9222cf7bdacd0194310b.tar.gz gcc-4c0f767939eb659b721f9222cf7bdacd0194310b.tar.bz2 |
lto-symtab.c (lto_cgraph_replace_node): When call statement is present, also set gimple_call_set_cannot_inline.
* lto-symtab.c (lto_cgraph_replace_node): When call statement is
present, also set gimple_call_set_cannot_inline.
* ipa-inline.c: Update toplevel comment.
(MAX_TIME): Remove.
(cgraph_clone_inlined_nodes): Fix linebreaks.
(cgraph_check_inline_limits): Restructure to ...
(caller_growth_limits): ... this one; be more tolerant
on growth in nested inline chains; add explanatory comment;
fix stack accounting thinko introduced by previous patch.
(cgraph_default_inline_p): Remove.
(report_inline_failed_reason): New function.
(can_inline_edge_p): New function.
(can_early_inline_edge_p): New function.
(leaf_node_p): Move upwards in file.
(want_early_inline_function_p): New function.
(want_inline_small_function_p): New function.
(want_inline_self_recursive_call_p): New function.
(cgraph_edge_badness): Rename to ...
(edge_badness) ... this one; fix linebreaks.
(update_edge_key): Update call of edge_baddness; add
detailed dump about queue updates.
(update_caller_keys): Use can_inline_edge_p and
want_inline_small_function_p.
(cgraph_decide_recursive_inlining): Rename to...
(recursive_inlining): Use can_inline_edge_p and
want_inline_self_recursive_call_p; simplify and
remove no longer valid FIXME.
(cgraph_set_inline_failed): Remove.
(add_new_edges_to_heap): Use can_inline_edge_p and
want_inline_small_function_p.
(cgraph_decide_inlining_of_small_functions): Rename to ...
(inline_small_functions): ... this one; cleanup; use
can/want predicates; cleanup debug ouput; work edges
till fibheap is exhausted and do not stop once unit
growth is reached; remove later loop processing remaining
edges.
(cgraph_flatten): Rename to ...
(flatten_function): ... this one; use can_inline_edge_p
and can_early_inline_edge_p predicates.
(cgraph_decide_inlining): Rename to ...
(ipa_inline): ... this one; remove unreachable nodes before
inlining functions called once; simplify the pass.
(cgraph_perform_always_inlining): Rename to ...
(inline_always_inline_functions): ... this one; use
DECL_DISREGARD_INLINE_LIMITS; use can_inline_edge_p
predicate
(cgraph_decide_inlining_incrementally): Rename to ...
(early_inline_small_functions): ... this one; simplify
using new predicates; cleanup; make dumps prettier.
(cgraph_early_inlining): Rename to ...
(early_inliner): newer inline regular functions into always-inlines;
fix updating of call stmt summaries.
(pass_early_inline): Update for new names.
(inline_transform): Fix formating.
(gate_cgraph_decide_inlining): Rename to ...
(pass_ipa_inline): ... this one.
* ipa-inline.h (inline_summary): Remove disregard_inline_limits.
* ipa-inline-analysis.c (dump_inline_summary): Update.
(compute_inline_parameters): Do not compute disregard_inline_limits;
look for mismatching arguments.
(estimate_growth): Fix handlig of non-trivial self recursion.
(inline_read_summary): Do not read info->disregard_inline_limits.
(inline_write_summary): Do not write info->disregard_inline_limits.
* tree-inline.c (inline_forbidden_into_p, tree_can_inline_p): Remove and
move all checks into can_inline_edge_p predicate; re-enable code comparing
optimization levels.
(expand_call_inline): Do not test inline_forbidden_into_p.
* Makefile.in (ipa-inline.o): Update arguments.
* gcc.dg/winline-5.c: Update testcase.
From-SVN: r172609
Diffstat (limited to 'gcc/tree-inline.c')
-rw-r--r-- | gcc/tree-inline.c | 99 |
1 files changed, 0 insertions, 99 deletions
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 79c9538..ea4baac 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -3138,29 +3138,6 @@ inline_forbidden_p (tree fndecl) return forbidden_p; } -/* Return true if CALLEE cannot be inlined into CALLER. */ - -static bool -inline_forbidden_into_p (tree caller, tree callee) -{ - /* Don't inline if the functions have different EH personalities. */ - if (DECL_FUNCTION_PERSONALITY (caller) - && DECL_FUNCTION_PERSONALITY (callee) - && (DECL_FUNCTION_PERSONALITY (caller) - != DECL_FUNCTION_PERSONALITY (callee))) - return true; - - /* Don't inline if the callee can throw non-call exceptions but the - caller cannot. */ - if (DECL_STRUCT_FUNCTION (callee) - && DECL_STRUCT_FUNCTION (callee)->can_throw_non_call_exceptions - && !(DECL_STRUCT_FUNCTION (caller) - && DECL_STRUCT_FUNCTION (caller)->can_throw_non_call_exceptions)) - return true; - - return false; -} - /* Returns nonzero if FN is a function that does not have any fundamental inline blocking properties. */ @@ -3750,10 +3727,6 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id) && gimple_has_body_p (DECL_ABSTRACT_ORIGIN (fn))) fn = DECL_ABSTRACT_ORIGIN (fn); - /* First check that inlining isn't simply forbidden in this case. */ - if (inline_forbidden_into_p (cg_edge->caller->decl, cg_edge->callee->decl)) - goto egress; - /* Don't try to inline functions that are not well-suited to inlining. */ if (!cgraph_inline_p (cg_edge, &reason)) { @@ -5298,75 +5271,3 @@ build_duplicate_type (tree type) return type; } - -/* Return whether it is safe to inline a function because it used different - target specific options or call site actual types mismatch parameter types. - E is the call edge to be checked. */ -bool -tree_can_inline_p (struct cgraph_edge *e) -{ -#if 0 - /* This causes a regression in SPEC in that it prevents a cold function from - inlining a hot function. Perhaps this should only apply to functions - that the user declares hot/cold/optimize explicitly. */ - - /* Don't inline a function with a higher optimization level than the - caller, or with different space constraints (hot/cold functions). */ - tree caller_tree = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (caller); - tree callee_tree = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (callee); - - if (caller_tree != callee_tree) - { - struct cl_optimization *caller_opt - = TREE_OPTIMIZATION ((caller_tree) - ? caller_tree - : optimization_default_node); - - struct cl_optimization *callee_opt - = TREE_OPTIMIZATION ((callee_tree) - ? callee_tree - : optimization_default_node); - - if ((caller_opt->optimize > callee_opt->optimize) - || (caller_opt->optimize_size != callee_opt->optimize_size)) - return false; - } -#endif - tree caller, callee; - - caller = e->caller->decl; - callee = e->callee->decl; - - /* First check that inlining isn't simply forbidden in this case. */ - if (inline_forbidden_into_p (caller, callee)) - { - e->inline_failed = CIF_UNSPECIFIED; - if (e->call_stmt) - gimple_call_set_cannot_inline (e->call_stmt, true); - return false; - } - - /* Allow the backend to decide if inlining is ok. */ - if (!targetm.target_option.can_inline_p (caller, callee)) - { - e->inline_failed = CIF_TARGET_OPTION_MISMATCH; - if (e->call_stmt) - gimple_call_set_cannot_inline (e->call_stmt, true); - e->call_stmt_cannot_inline_p = true; - return false; - } - - /* Do not inline calls where we cannot triviall work around mismatches - in argument or return types. */ - if (e->call_stmt - && !gimple_check_call_matching_types (e->call_stmt, callee)) - { - e->inline_failed = CIF_MISMATCHED_ARGUMENTS; - if (e->call_stmt) - gimple_call_set_cannot_inline (e->call_stmt, true); - e->call_stmt_cannot_inline_p = true; - return false; - } - - return true; -} |