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.
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;
}
--- /dev/null
+/* { 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;
+}