* [PATCH, PR 49495] Cgraph verifier must look through aliases
@ 2011-07-03 9:45 Martin Jambor
2011-07-04 9:13 ` Jan Hubicka
0 siblings, 1 reply; 4+ messages in thread
From: Martin Jambor @ 2011-07-03 9:45 UTC (permalink / raw)
To: GCC Patches; +Cc: Jan Hubicka
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 <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.
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. */
+ && (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:");
+ debug_tree (e->callee->decl);
+ fprintf (stderr," Instead of:");
+ debug_tree (decl);
+ return true;
+ }
+ else
+ return false;
+}
+
/* Verify cgraph nodes of given cgraph node. */
DEBUG_FUNCTION void
verify_cgraph_node (struct cgraph_node *node)
@@ -702,24 +730,8 @@ 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))
- {
- error ("edge points to wrong declaration:");
- debug_tree (e->callee->decl);
- fprintf (stderr," Instead of:");
- debug_tree (decl);
- error_found = true;
- }
+ if (verify_edge_corresponds_to_fndecl (e, decl))
+ error_found = true;
}
else if (decl)
{
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH, PR 49495] Cgraph verifier must look through aliases
2011-07-03 9:45 [PATCH, PR 49495] Cgraph verifier must look through aliases Martin Jambor
@ 2011-07-04 9:13 ` Jan Hubicka
2011-07-07 18:26 ` Martin Jambor
0 siblings, 1 reply; 4+ messages in thread
From: Jan Hubicka @ 2011-07-04 9:13 UTC (permalink / raw)
To: GCC Patches, Jan Hubicka
> 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 <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.
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. */
> + && (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:");
> + debug_tree (e->callee->decl);
> + fprintf (stderr," Instead of:");
> + debug_tree (decl);
> + return true;
> + }
> + else
> + return false;
> +}
> +
> /* Verify cgraph nodes of given cgraph node. */
> DEBUG_FUNCTION void
> verify_cgraph_node (struct cgraph_node *node)
> @@ -702,24 +730,8 @@ 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))
> - {
> - error ("edge points to wrong declaration:");
> - debug_tree (e->callee->decl);
> - fprintf (stderr," Instead of:");
> - debug_tree (decl);
> - 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...
Honza
> }
> else if (decl)
> {
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH, PR 49495] Cgraph verifier must look through aliases
2011-07-04 9:13 ` Jan Hubicka
@ 2011-07-07 18:26 ` Martin Jambor
2011-07-07 18:49 ` Jan Hubicka
0 siblings, 1 reply; 4+ messages in thread
From: Martin Jambor @ 2011-07-07 18:26 UTC (permalink / raw)
To: Jan Hubicka; +Cc: GCC Patches
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 <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.
>
> 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 <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.
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);
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH, PR 49495] Cgraph verifier must look through aliases
2011-07-07 18:26 ` Martin Jambor
@ 2011-07-07 18:49 ` Jan Hubicka
0 siblings, 0 replies; 4+ messages in thread
From: Jan Hubicka @ 2011-07-07 18:49 UTC (permalink / raw)
To: Jan Hubicka, GCC Patches
> 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 <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.
> >
> > 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))
should be possible to change to
&& (cgraph_get_node (decl) != e->callee)
i.e. not try to go through the aliases
>
> > > + && (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 <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.
>
>
> 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);
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2011-07-07 18:44 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-07-03 9:45 [PATCH, PR 49495] Cgraph verifier must look through aliases Martin Jambor
2011-07-04 9:13 ` Jan Hubicka
2011-07-07 18:26 ` Martin Jambor
2011-07-07 18:49 ` Jan Hubicka
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).