From b631d45ac3d9d53a648885ac6b88210da192ab37 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Tue, 17 Sep 2013 19:45:00 +0200 Subject: [PATCH] re PR ipa/58332 (error: inlined_to pointer is set but no predecessors found) PR middle-end/58332 * gcc.c-torture/compile/pr58332.c: New testcase. * cif-code.def (FUNCTION_NOT_OPTIMIZED): New CIF code. * ipa-inline.c (can_inline_edge_p): Do not downgrade FUNCTION_NOT_OPTIMIZED. * ipa-inline-analysis.c (compute_inline_parameters): Function not optimized is not inlinable unless it is alwaysinline. (inline_analyze_function): Force calls in not optimized function not inlinable. From-SVN: r202661 --- gcc/ChangeLog | 11 ++++++++++ gcc/cif-code.def | 3 +++ gcc/ipa-inline-analysis.c | 22 ++++++++++++++++++- gcc/ipa-inline.c | 3 ++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/pr58332.c | 2 ++ 6 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr58332.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 78f4cbc6ce7..616a3f9baf2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -26,6 +26,17 @@ make_pass_early_warn_uninitialized): Move from tree-ssa.c * tree-ssa.h: Adjust prototypes +2013-09-17 Jan Hubicka + + PR middle-end/58332 + * cif-code.def (FUNCTION_NOT_OPTIMIZED): New CIF code. + * ipa-inline.c (can_inline_edge_p): Do not downgrade + FUNCTION_NOT_OPTIMIZED. + * ipa-inline-analysis.c (compute_inline_parameters): Function + not optimized is not inlinable unless it is alwaysinline. + (inline_analyze_function): Force calls in not optimized + function not inlinable. + 2013-09-17 Jan Hubicka PR middle-end/58329 diff --git a/gcc/cif-code.def b/gcc/cif-code.def index d1c49417325..e71123dc609 100644 --- a/gcc/cif-code.def +++ b/gcc/cif-code.def @@ -37,6 +37,9 @@ DEFCIFCODE(UNSPECIFIED , "") functions that have not been rejected for inlining yet. */ DEFCIFCODE(FUNCTION_NOT_CONSIDERED, N_("function not considered for inlining")) +/* Caller is compiled with optimizations disabled. */ +DEFCIFCODE(FUNCTION_NOT_OPTIMIZED, N_("caller is not optimized")) + /* Inlining failed owing to unavailable function body. */ DEFCIFCODE(BODY_NOT_AVAILABLE, N_("function body not available")) diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c index eaf64d35853..ba6221e41fd 100644 --- a/gcc/ipa-inline-analysis.c +++ b/gcc/ipa-inline-analysis.c @@ -2664,7 +2664,11 @@ compute_inline_parameters (struct cgraph_node *node, bool early) info->stack_frame_offset = 0; /* Can this function be inlined at all? */ - info->inlinable = tree_inlinable_function_p (node->symbol.decl); + if (!optimize && !lookup_attribute ("always_inline", + DECL_ATTRIBUTES (node->symbol.decl))) + info->inlinable = false; + else + info->inlinable = tree_inlinable_function_p (node->symbol.decl); /* Type attributes can use parameter indices to describe them. */ if (TYPE_ATTRIBUTES (TREE_TYPE (node->symbol.decl))) @@ -3678,6 +3682,22 @@ inline_analyze_function (struct cgraph_node *node) if (optimize && !node->thunk.thunk_p) inline_indirect_intraprocedural_analysis (node); compute_inline_parameters (node, false); + if (!optimize) + { + struct cgraph_edge *e; + for (e = node->callees; e; e = e->next_callee) + { + if (e->inline_failed == CIF_FUNCTION_NOT_CONSIDERED) + e->inline_failed = CIF_FUNCTION_NOT_OPTIMIZED; + e->call_stmt_cannot_inline_p = true; + } + for (e = node->indirect_calls; e; e = e->next_callee) + { + if (e->inline_failed == CIF_FUNCTION_NOT_CONSIDERED) + e->inline_failed = CIF_FUNCTION_NOT_OPTIMIZED; + e->call_stmt_cannot_inline_p = true; + } + } pop_cfun (); } diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 266c0486728..3672e57e471 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -275,7 +275,8 @@ can_inline_edge_p (struct cgraph_edge *e, bool report, } else if (e->call_stmt_cannot_inline_p) { - e->inline_failed = CIF_MISMATCHED_ARGUMENTS; + if (e->inline_failed != CIF_FUNCTION_NOT_OPTIMIZED) + e->inline_failed = CIF_MISMATCHED_ARGUMENTS; inlinable = false; } /* Don't inline if the functions have different EH personalities. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d51c300bd10..b36c03355cd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-09-17 Jan Hubicka + + PR middle-end/58332 + * gcc.c-torture/compile/pr58332.c: New testcase. + 2013-09-17 Jeff Law * gcc.c-torture/execute/pr58387.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr58332.c b/gcc/testsuite/gcc.c-torture/compile/pr58332.c new file mode 100644 index 00000000000..22c586cb866 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr58332.c @@ -0,0 +1,2 @@ +static inline int foo (int x) { return x + 1; } +__attribute__ ((__optimize__ (0))) int bar (void) { return foo (100); }