diff options
author | Jan Hubicka <jh@suse.cz> | 2013-09-17 19:45:00 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2013-09-17 17:45:00 +0000 |
commit | b631d45ac3d9d53a648885ac6b88210da192ab37 (patch) | |
tree | ad0eee441d92de888ca7a13df2182efb4f34930e /gcc | |
parent | 8d34e421a5668e25a992bd0b349cb81e91ee3e49 (diff) | |
download | gcc-b631d45ac3d9d53a648885ac6b88210da192ab37.zip gcc-b631d45ac3d9d53a648885ac6b88210da192ab37.tar.gz gcc-b631d45ac3d9d53a648885ac6b88210da192ab37.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/cif-code.def | 3 | ||||
-rw-r--r-- | gcc/ipa-inline-analysis.c | 22 | ||||
-rw-r--r-- | gcc/ipa-inline.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr58332.c | 2 |
6 files changed, 44 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 78f4cbc..616a3f9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -28,6 +28,17 @@ 2013-09-17 Jan Hubicka <jh@suse.cz> + 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 <jh@suse.cz> + PR middle-end/58329 * ipa-devirt.c (ipa_devirt): Be ready for symtab_nonoverwritable_alias to return NULL. diff --git a/gcc/cif-code.def b/gcc/cif-code.def index d1c4941..e71123d 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 eaf64d3..ba6221e 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 266c0486..3672e57 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 d51c300..b36c033 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-09-17 Jan Hubicka <jh@suse.cz> + + PR middle-end/58332 + * gcc.c-torture/compile/pr58332.c: New testcase. + 2013-09-17 Jeff Law <law@redhat.com> * 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 0000000..22c586c --- /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); } |