ipa: Adjust cgraph verifier to materialization on demand (PR 98222)

after switching to materialization of clones on demand, the verifier
can happen to see edges leading to a clone of a materialized clone.
This means its clone_of is NULL and former_clone_of needs to be
checked in order to verify that the callee is a clone of the original
decl, which it did not do and reported edges to pointing to a wrong
place.

Fixed with the following patch, which has been pre-approved by Honza.
Bootstrapped and tested on x86_64-linux, pushed to master.

Martin

gcc/ChangeLog:

2021-01-15  Martin Jambor  <mjambor@suse.cz>

	PR ipa/98222
	* cgraph.c (clone_of_p): Check also former_clone_of as we climb
	the clone tree.

gcc/testsuite/ChangeLog:

2021-01-15  Martin Jambor  <mjambor@suse.cz>

	PR ipa/98222
	* gcc.dg/ipa/pr98222.c: New test.
This commit is contained in:
Martin Jambor 2021-01-17 22:31:09 +01:00
parent 3804e937b0
commit 0f4c8f517b
2 changed files with 22 additions and 1 deletions

View file

@ -3081,7 +3081,9 @@ clone_of_p (cgraph_node *node, cgraph_node *node2)
if (!node->thunk && !node->former_thunk_p ())
{
while (node2 && node->decl != node2->decl)
while (node2
&& node->decl != node2->decl
&& node->decl != node2->former_clone_of)
node2 = node2->clone_of;
return node2 != NULL;
}

View file

@ -0,0 +1,19 @@
/* { dg-do compile } */
/* { dg-options "-O3" } */
int a, b, *c;
int f (int j, int k) {
b = k / j;
if (a)
f(0, 0);
*c = f(b & a, 0);
return 0;
}
int main() {
if (a)
while (1)
f(0, 0);
return 0;
}