mirror of git://gcc.gnu.org/git/gcc.git
Check that clones of edges exist during IPA-CP
2018-04-20 Martin Jambor <mjambor@suse.cz> 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
This commit is contained in:
parent
e00e62761d
commit
5fc1b92025
|
|
@ -1,3 +1,9 @@
|
|||
2018-04-20 Martin Jambor <mjambor@suse.cz>
|
||||
|
||||
ipa/85447
|
||||
* ipa-cp.c (create_specialized_node): Check that clones of
|
||||
self-recursive edges exist during IPA-CP.
|
||||
|
||||
2018-04-19 Toon Moene <toon@moene.org>
|
||||
|
||||
* doc/invoke.texi: Add -floop-unroll-and-jam to options enabled
|
||||
|
|
|
|||
14
gcc/ipa-cp.c
14
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 ();
|
||||
|
|
|
|||
|
|
@ -1,3 +1,9 @@
|
|||
2018-04-20 Martin Jambor <mjambor@suse.cz>
|
||||
|
||||
ipa/85447
|
||||
* g++.dg/ipa/pr85447.C: New file.
|
||||
* gcc.dg/ipa/ipcp-self-recursion-1.c: Likewise.
|
||||
|
||||
2018-04-20 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/85462
|
||||
|
|
|
|||
|
|
@ -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); }
|
||||
|
|
@ -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;
|
||||
}
|
||||
Loading…
Reference in New Issue