From 5fc1b92025fa55f6de9f93bf02df424a17802e55 Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Fri, 20 Apr 2018 11:19:39 +0200 Subject: [PATCH] Check that clones of edges exist during IPA-CP 2018-04-20 Martin Jambor ipa/85447 * ipa-cp.c (create_specialized_node): Check that clones of self-recursive edges exist during IPA-CP. testsuite/ * g++.dg/ipa/pr85447.C: New file. * gcc.dg/ipa/ipcp-self-recursion-1.c: Likewise. From-SVN: r259517 --- gcc/ChangeLog | 6 +++ gcc/ipa-cp.c | 14 ++++-- gcc/testsuite/ChangeLog | 6 +++ gcc/testsuite/g++.dg/ipa/pr85447.C | 23 ++++++++++ .../gcc.dg/ipa/ipcp-self-recursion-1.c | 46 +++++++++++++++++++ 5 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ipa/pr85447.C create mode 100644 gcc/testsuite/gcc.dg/ipa/ipcp-self-recursion-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f94a904407d..a2441991818 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-04-20 Martin Jambor + + ipa/85447 + * ipa-cp.c (create_specialized_node): Check that clones of + self-recursive edges exist during IPA-CP. + 2018-04-19 Toon Moene * doc/invoke.texi: Add -floop-unroll-and-jam to options enabled diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 4e0e20af409..9388482bbea 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -3867,9 +3867,17 @@ create_specialized_node (struct cgraph_node *node, for (unsigned j = 0; j < self_recursive_calls.length (); j++) { cgraph_edge *cs = next_edge_clone[self_recursive_calls[j]->uid]; - gcc_checking_assert (cs); - gcc_assert (cs->caller == new_node); - cs->redirect_callee_duplicating_thunks (new_node); + /* Cloned edges can disappear during cloning as speculation can be + resolved, check that we have one and that it comes from the last + cloning. */ + if (cs && cs->caller == new_node) + cs->redirect_callee_duplicating_thunks (new_node); + /* Any future code that would make more than one clone of an outgoing + edge would confuse this mechanism, so let's check that does not + happen. */ + gcc_checking_assert (!cs + || !next_edge_clone[cs->uid] + || next_edge_clone[cs->uid]->caller != new_node); } if (have_self_recursive_calls) new_node->expand_all_artificial_thunks (); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3450e1dca70..92b40feafdf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-04-20 Martin Jambor + + ipa/85447 + * g++.dg/ipa/pr85447.C: New file. + * gcc.dg/ipa/ipcp-self-recursion-1.c: Likewise. + 2018-04-20 Jakub Jelinek PR c++/85462 diff --git a/gcc/testsuite/g++.dg/ipa/pr85447.C b/gcc/testsuite/g++.dg/ipa/pr85447.C new file mode 100644 index 00000000000..d7a7716af2e --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr85447.C @@ -0,0 +1,23 @@ +// { dg-do compile } +// { dg-options "-O3 -std=gnu++11" } + +typedef int a; +enum b : a; +class c { +public: + enum { d }; + virtual b e(int *, int, const int *) = 0; +}; +class f : c { + b e(int *, int, const int *); + b g(); +}; +b f::e(int *h, int i, const int *j) { + if (i == d) + return g(); + for (;;) + e(h, i, j); +} +int k; +c *l; +void m() { l->e(&k, c::d, nullptr); } diff --git a/gcc/testsuite/gcc.dg/ipa/ipcp-self-recursion-1.c b/gcc/testsuite/gcc.dg/ipa/ipcp-self-recursion-1.c new file mode 100644 index 00000000000..7ecbf79de61 --- /dev/null +++ b/gcc/testsuite/gcc.dg/ipa/ipcp-self-recursion-1.c @@ -0,0 +1,46 @@ +/* { dg-do run } */ +/* { dg-options "-O3 -fno-early-inlining" } */ + +int array[128]; + +volatile int v = 0; +volatile int blah = 0; +volatile int counter = 0; + +int __attribute__((noipa)) +obscured_one () +{ + return 1; +} + +static void +f (int c, int l) +{ + int i; + for (i = 0; i < c; i++) + array[i] = 455; + + counter++; + if (counter > 6) + __builtin_abort (); + + v = l; + if (l > 0) + f (c, l - 1); + blah = l; +} + +int +main (int argc, char *argv[]) +{ + int i; + for (i = 0; i < 100; i++) + { + counter = 0; + f (0, 5); + if (obscured_one ()) + break; + } + + return 0; +} -- 2.30.2