diff options
author | Richard Guenther <rguenther@suse.de> | 2010-04-12 13:37:32 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2010-04-12 13:37:32 +0000 |
commit | af961c7f461a46db81d59c997b513509f6e32ae8 (patch) | |
tree | 0fc12cc23e959d8fab2d03cc1f2bb306af12a14a /gcc/ipa.c | |
parent | fa8351f8d807ec9cde27984171670438295bc7b4 (diff) | |
download | gcc-af961c7f461a46db81d59c997b513509f6e32ae8.zip gcc-af961c7f461a46db81d59c997b513509f6e32ae8.tar.gz gcc-af961c7f461a46db81d59c997b513509f6e32ae8.tar.bz2 |
ipa.c (cgraph_postorder): Adjust postorder to guarantee single-iteration always-inline inlining.
2010-04-12 Richard Guenther <rguenther@suse.de>
* ipa.c (cgraph_postorder): Adjust postorder to guarantee
single-iteration always-inline inlining.
* ipa-inline.c (cgraph_mark_inline): Do not return anything.
(cgraph_decide_inlining): Do not handle always-inline
specially.
(try_inline): Remove always-inline cycle detection special case.
Do not recurse on always-inlines.
(cgraph_early_inlining): Do not iterate if not optimizing.
(cgraph_gate_early_inlining): remove.
(pass_early_inline): Run unconditionally.
(gate_cgraph_decide_inlining): New function.
(pass_ipa_inline): Use it. Do not run the IPA inliner if
not inlining or optimizing.
(cgraph_decide_inlining_of_small_functions): Also consider
always-inline functions.
(cgraph_default_inline_p): Return true for nodes which should
disregard inline limits.
(estimate_function_body_sizes): Assume zero size and time for
nodes which are marked as disregarding inline limits.
(cgraph_decide_recursive_inlining): Do not perform recursive
inlining on always-inline nodes.
* gcc.dg/torture/inline-2.c: New testcase.
From-SVN: r158225
Diffstat (limited to 'gcc/ipa.c')
-rw-r--r-- | gcc/ipa.c | 6 |
1 files changed, 6 insertions, 0 deletions
@@ -70,6 +70,12 @@ cgraph_postorder (struct cgraph_node **order) node2->aux = edge->next_caller; else node2->aux = &last; + /* Break possible cycles involving always-inline + functions by ignoring edges from always-inline + functions to non-always-inline functions. */ + if (edge->caller->local.disregard_inline_limits + && !edge->callee->local.disregard_inline_limits) + continue; if (!edge->caller->aux) { if (!edge->caller->callers) |