aboutsummaryrefslogtreecommitdiff
path: root/gcc/ipa.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-04-12 13:37:32 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-04-12 13:37:32 +0000
commitaf961c7f461a46db81d59c997b513509f6e32ae8 (patch)
tree0fc12cc23e959d8fab2d03cc1f2bb306af12a14a /gcc/ipa.c
parentfa8351f8d807ec9cde27984171670438295bc7b4 (diff)
downloadgcc-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.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/gcc/ipa.c b/gcc/ipa.c
index 1cc7221..d559ab2 100644
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -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)