aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2011-07-07 20:08:00 +0200
committerMartin Jambor <jamborm@gcc.gnu.org>2011-07-07 20:08:00 +0200
commit81361831c0307a7aed5b58ec52928ef599f43a94 (patch)
tree8159ccb5866dbd028e5b0afeb4995c90cc5024a0 /gcc
parent1797adbd71ae2b421f741840fe24baf4640ea6fa (diff)
downloadgcc-81361831c0307a7aed5b58ec52928ef599f43a94.zip
gcc-81361831c0307a7aed5b58ec52928ef599f43a94.tar.gz
gcc-81361831c0307a7aed5b58ec52928ef599f43a94.tar.bz2
re PR middle-end/49495 (-O3 causes error message "edge points to wrong declaration:")
2011-07-07 Martin Jambor <mjambor@suse.cz> PR middle-end/49495 * cgraphunit.c (verify_edge_corresponds_to_fndecl): New function. (verify_cgraph_node): Some functinality moved to verify_edge_corresponds_to_fndecl, call it. From-SVN: r175998
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/cgraphunit.c34
2 files changed, 30 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d9670d5..dbeb8e6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2011-07-07 Martin Jambor <mjambor@suse.cz>
+
+ PR middle-end/49495
+ * cgraphunit.c (verify_edge_corresponds_to_fndecl): New function.
+ (verify_cgraph_node): Some functinality moved to
+ verify_edge_corresponds_to_fndecl, call it.
+
2011-07-07 Joseph Myers <joseph@codesourcery.com>
* config.gcc (*local*): Remove.
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index e470d85..2414d86 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -450,6 +450,28 @@ cgraph_debug_gimple_stmt (struct function *this_cfun, gimple stmt)
debug_gimple_stmt (stmt);
}
+/* Verify that call graph edge E corresponds to DECL from the associated
+ statement. Return true if the verification should fail. */
+
+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)
+ /* 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))
+ return true;
+ else
+ return false;
+}
+
/* Verify cgraph nodes of given cgraph node. */
DEBUG_FUNCTION void
verify_cgraph_node (struct cgraph_node *node)
@@ -702,17 +724,7 @@ verify_cgraph_node (struct cgraph_node *node)
}
if (!e->indirect_unknown_callee)
{
- if (!e->callee->global.inlined_to
- && decl
- && cgraph_get_node (decl)
- && (e->callee->former_clone_of
- != cgraph_get_node (decl)->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))
+ if (verify_edge_corresponds_to_fndecl (e, decl))
{
error ("edge points to wrong declaration:");
debug_tree (e->callee->decl);