diff options
author | Jan Hubicka <jh@suse.cz> | 2012-03-22 15:33:27 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2012-03-22 14:33:27 +0000 |
commit | b4e93f4518eccf83c79145c0b74e6c72ce9bbc0f (patch) | |
tree | 03738d0312372fd214a53bbb313ffd06dbb04d03 /gcc/ipa-inline-transform.c | |
parent | e45381b354ce6eac6cbcbf8a83f818c82ac52ac7 (diff) | |
download | gcc-b4e93f4518eccf83c79145c0b74e6c72ce9bbc0f.zip gcc-b4e93f4518eccf83c79145c0b74e6c72ce9bbc0f.tar.gz gcc-b4e93f4518eccf83c79145c0b74e6c72ce9bbc0f.tar.bz2 |
re PR tree-optimization/51737 (g++ crashes (internal compiler error: Segmentation fault) when compiling quickbook)
PR middle-end/51737
* cgraph.c (cgraph_remove_node_and_inline_clones): Add FORBIDDEN_NODE
parameter.
* cgraph.h (cgraph_remove_node_and_inline_clones): Update prototype.
* ipa-inline-transform.c (save_inline_function_body): Remove copied clone
if needed.
* tree-inline.c (delete_unreachable_blocks_update_callgraph): Update.
PR middle-end/51737
* g++.dg/torture/pr51737.C: New testcase
From-SVN: r185694
Diffstat (limited to 'gcc/ipa-inline-transform.c')
-rw-r--r-- | gcc/ipa-inline-transform.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/gcc/ipa-inline-transform.c b/gcc/ipa-inline-transform.c index 75b8e9d..32d8c16 100644 --- a/gcc/ipa-inline-transform.c +++ b/gcc/ipa-inline-transform.c @@ -336,8 +336,19 @@ save_inline_function_body (struct cgraph_node *node) first_clone->ipa_transforms_to_apply); first_clone->ipa_transforms_to_apply = NULL; + /* When doing recursive inlining, the clone may become unnecessary. + This is possible i.e. in the case when the recursive function is proved to be + non-throwing and the recursion happens only in the EH landing pad. + We can not remove the clone until we are done with saving the body. + Remove it now. */ + if (!first_clone->callers) + { + cgraph_remove_node_and_inline_clones (first_clone, NULL); + first_clone = NULL; + } #ifdef ENABLE_CHECKING - verify_cgraph_node (first_clone); + else + verify_cgraph_node (first_clone); #endif return first_clone; } |