diff options
author | Jan Hubicka <jh@suse.cz> | 2010-09-19 01:13:17 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2010-09-18 23:13:17 +0000 |
commit | 9b389a5e64f957b30eb05315b7e15a649a8e1f66 (patch) | |
tree | 863c05e9f2399d3ae354b494076e8a668b4ee323 /gcc/ipa.c | |
parent | 1151446c17ede83ed30b2bfc68137e7573ed0d99 (diff) | |
download | gcc-9b389a5e64f957b30eb05315b7e15a649a8e1f66.zip gcc-9b389a5e64f957b30eb05315b7e15a649a8e1f66.tar.gz gcc-9b389a5e64f957b30eb05315b7e15a649a8e1f66.tar.bz2 |
re PR tree-optimization/45453 (ICE: verify_cgraph_node failed: inlined_to pointer set for noninline callers with -O2 -fno-early-inlining)
PR tree-optimization/45453
* cgraphunit.c (cgraph_finalize_function): Consider comdat & external
virtual functions are reachable.
* ipa-inline.c (cgraph_clone_inlined_nodes): Likewise.
* ipa.c (cgraph_remove_unreachable_nodes): Likewise.
* ipa-prop.c (ipa_modify_formal_parameters): Clear DECL_VIRTUAL_P
when modifying function.
* g++.dg/tree-ssa/pr45453.C: New testcase.
From-SVN: r164405
Diffstat (limited to 'gcc/ipa.c')
-rw-r--r-- | gcc/ipa.c | 7 |
1 files changed, 6 insertions, 1 deletions
@@ -238,7 +238,12 @@ cgraph_remove_unreachable_nodes (bool before_inlining_p, FILE *file) #endif varpool_reset_queue (); for (node = cgraph_nodes; node; node = node->next) - if (!cgraph_can_remove_if_no_direct_calls_and_refs_p (node) + if ((!cgraph_can_remove_if_no_direct_calls_and_refs_p (node) + /* Keep around virtual functions for possible devirtualization. */ + || (!before_inlining_p + && !node->global.inlined_to + && DECL_VIRTUAL_P (node->decl) + && (DECL_COMDAT (node->decl) || DECL_EXTERNAL (node->decl)))) && ((!DECL_EXTERNAL (node->decl)) || before_inlining_p)) { |