diff options
author | Martin Jambor <mjambor@suse.cz> | 2011-07-22 17:35:48 +0200 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2011-07-22 17:35:48 +0200 |
commit | b75d1e2107d37a1a6d0fb3b3adc56a275ed711bf (patch) | |
tree | a8fabfc4f373e5ae7182d4eb190354da6077e808 /gcc/cgraphunit.c | |
parent | e3c666fd0e44831a691ad915af34c21c326c44c3 (diff) | |
download | gcc-b75d1e2107d37a1a6d0fb3b3adc56a275ed711bf.zip gcc-b75d1e2107d37a1a6d0fb3b3adc56a275ed711bf.tar.gz gcc-b75d1e2107d37a1a6d0fb3b3adc56a275ed711bf.tar.bz2 |
re PR lto/49796 (483.xalancbmk/447.dealII in SPEC CPU 2006 failed to build)
2011-07-22 Martin Jambor <mjambor@suse.cz>
PR lto/49796
* cgraphunit.c (verify_edge_corresponds_to_fndecl): Return false
if decl node is in another partition, call cgraph_get_node only
once.
From-SVN: r176630
Diffstat (limited to 'gcc/cgraphunit.c')
-rw-r--r-- | gcc/cgraphunit.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 83ac720..93664f9 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -456,17 +456,23 @@ cgraph_debug_gimple_stmt (struct function *this_cfun, gimple stmt) static bool verify_edge_corresponds_to_fndecl (struct cgraph_edge *e, tree decl) { - if (!e->callee->global.inlined_to - && decl - && cgraph_get_node (decl) - && (e->callee->former_clone_of - != cgraph_function_or_thunk_node (cgraph_get_node (decl), NULL)->decl) + struct cgraph_node *node; + + if (!decl || e->callee->global.inlined_to) + return false; + node = cgraph_get_node (decl); + + /* We do not know if a node from a different partition is an alias or what it + aliases and therefore cannot do the former_clone_of check reliably. */ + if (!node || node->in_other_partition) + return false; + node = cgraph_function_or_thunk_node (node, NULL); + + if ((e->callee->former_clone_of != node->decl) /* IPA-CP sometimes redirect edge to clone and then back to the former function. This ping-pong has to go, eventaully. */ - && (cgraph_function_or_thunk_node (cgraph_get_node (decl), NULL) - != cgraph_function_or_thunk_node (e->callee, NULL)) - && !clone_of_p (cgraph_get_node (decl), - e->callee)) + && (node != cgraph_function_or_thunk_node (e->callee, NULL)) + && !clone_of_p (node, e->callee)) return true; else return false; |