This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
PR middle-end/40080
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sat, 9 May 2009 22:11:41 +0200
- Subject: PR middle-end/40080
Hi,
middle-end/40080 shows side case where ipa-cp clone is created and it is
fully inlined, one of the callees gets indirect call converted into
direct call that eventually results in clone materialization to redirect
the call incorrectly.
Bootstrapped/regtested x86_64-linux and commited.
Index: ChangeLog
===================================================================
--- ChangeLog (revision 147319)
+++ ChangeLog (working copy)
@@ -1,5 +1,11 @@
2009-05-09 Jan Hubicka <jh@suse.cz>
+ PR middle-end/40080
+ * cgraphunit.c (cgraph_materialize_all_clones): Do not redirect
+ indirect calls; verify cgraph afterwards.
+
+2009-05-09 Jan Hubicka <jh@suse.cz>
+
PR bootstrap/40082
* ipa.c (update_inlined_to_pointer): New function.
(cgraph_remove_unreachable_nodes): Use it.
Index: cgraphunit.c
===================================================================
--- cgraphunit.c (revision 147319)
+++ cgraphunit.c (working copy)
@@ -1762,7 +1762,12 @@ cgraph_materialize_all_clones (void)
for (e = node->callees; e; e = e->next_callee)
{
tree decl = gimple_call_fndecl (e->call_stmt);
- if (decl != e->callee->decl)
+ /* When function gets inlined, indirect inlining might've invented
+ new edge for orginally indirect stmt. Since we are not
+ preserving clones in the original form, we must not update here
+ since other inline clones don't need to contain call to the same
+ call. Inliner will do the substitution for us later. */
+ if (decl && decl != e->callee->decl)
{
gimple new_stmt;
gimple_stmt_iterator gsi;
@@ -1808,6 +1813,9 @@ cgraph_materialize_all_clones (void)
verify_cgraph_node (node);
#endif
}
+#ifdef ENABLE_CHECKING
+ verify_cgraph ();
+#endif
cgraph_remove_unreachable_nodes (false, cgraph_dump_file);
}