Hi,

On Mon, Jul 04, 2011 at 11:13:12AM +0200, Jan Hubicka wrote:
> > Hi,
> > 
> > PR 49495 is actually a bug in the verifier that does not look through
> > aliases at one point.  Fixed wit the patch below (created a special
> > function, otherwise I just wasn't able to fit the 80 column limit).
> > Bootstrapped and tested on x86_64-linux.  OK for trunk?
> > 
> > Thanks,
> > 
> > Martin
> > 
> > 
> > 2011-07-02  Martin Jambor  <mjam...@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.
> 
> This is OK.
> > 
> > 
> > Index: src/gcc/cgraphunit.c
> > ===================================================================
> > --- src.orig/gcc/cgraphunit.c
> > +++ src/gcc/cgraphunit.c
> > @@ -450,6 +450,34 @@ cgraph_debug_gimple_stmt (struct functio
> >    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.  */

BTW, I am having hard time trying to figure out how this comment
relates to any of the tests in the conjunction. I'm obvioulsy asking
because the new IPA-CP does not do this and so we could get rid of it,
whatever the "it" is.

> > +      && (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))
> > +    {
> > +      error ("edge points to wrong declaration:");

...

> > -                           error_found = true;
> > -                         }
> > +                       if (verify_edge_corresponds_to_fndecl (e, decl))
> > +                         error_found = true;
> Could you please move the error output here, somehow I like it better when all
> the diagnostic is output at single place...
> 

Sure, this is what I have just committed as revision 175998 after a
bootstrap and testing on x86_64-linux.

Thanks,

Martin



2011-07-07  Martin Jambor  <mjam...@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.


Index: src/gcc/cgraphunit.c
===================================================================
--- src.orig/gcc/cgraphunit.c
+++ src/gcc/cgraphunit.c
@@ -450,6 +450,28 @@ cgraph_debug_gimple_stmt (struct functio
   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 *
                          }
                        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);

Reply via email to