diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cgraphunit.c | 10 |
2 files changed, 15 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6de79af..73de4f3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 9366ebe..e88d00d 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -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); } |