summaryrefslogtreecommitdiff
path: root/gcc/ipa-inline-transform.c
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2012-03-22 14:33:27 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2012-03-22 14:33:27 +0000
commit41710b76736db179e72878dd39a32ef0d4f2677e (patch)
tree03738d0312372fd214a53bbb313ffd06dbb04d03 /gcc/ipa-inline-transform.c
parent1957dffb70bbcde6a29342f407e4982916e92eb9 (diff)
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 git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@185694 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ipa-inline-transform.c')
-rw-r--r--gcc/ipa-inline-transform.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/gcc/ipa-inline-transform.c b/gcc/ipa-inline-transform.c
index 75b8e9daf11f..32d8c167be17 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;
}