This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/55264] [4.6/4.7/4.8 Regression] ICE: in ipa_make_edge_direct_to_target, at ipa-prop.c:2141 with -O2 -fno-early-inlining -fno-weak
- From: "aldyh at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Tue, 27 Nov 2012 15:34:06 +0000
- Subject: [Bug tree-optimization/55264] [4.6/4.7/4.8 Regression] ICE: in ipa_make_edge_direct_to_target, at ipa-prop.c:2141 with -O2 -fno-early-inlining -fno-weak
- Auto-submitted: auto-generated
- References: <bug-55264-4@http.gcc.gnu.org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55264
Aldy Hernandez <aldyh at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jakub at gcc dot gnu.org,
| |jason at gcc dot gnu.org
--- Comment #3 from Aldy Hernandez <aldyh at gcc dot gnu.org> 2012-11-27 15:34:06 UTC ---
When compiled with -fno-weak, we re-use the out-of-line copy in
clone_inlined_nodes(), around here:
/* We may eliminate the need for out-of-line copy to be output.
In that case just go ahead and re-use it. This is not just an
memory optimization. Making offline copy of fuction disappear
from the program will improve future decisions on inlining. */
This happens because the conditional can_remove_node_now_p_1() returns true for
virtuals that are not weak:
/* Inlining might enable more devirtualizing, so we want to remove
those only after all devirtualizable virtual calls are processed.
Lacking may edges in callgraph we just preserve them post
inlining. */
&& (!DECL_VIRTUAL_P (node->symbol.decl)
|| (!DECL_COMDAT (node->symbol.decl)
&& !DECL_EXTERNAL (node->symbol.decl)))
When we re-use the out-of-line copy in clone_inlined_nodes(), we end up setting
inlined_to here:
e->callee->global.inlined_to = e->caller;
This causes the ICE in ipa_make_edge_direct_to_target, because inlined_to is
non-NULL:
/* We can not make edges to inline clones. It is bug that someone removed
the cgraph node too early. */
gcc_assert (!callee->global.inlined_to);
Any tips on how to proceed from here?