From 2f1f3ac43828d7c9b8899f23683bf6b88066fc4a Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Fri, 20 Apr 2018 11:35:33 +0200 Subject: [PATCH] Fix IPA-CP test for self-feeding recursive dependency 2018-04-20 Martin Jambor ipa/85449 * ipa-cp.c (cgraph_edge_brings_value_p): Move check for self-feeding recursion dependency to only apply to non-clones. testsuite/ * gcc.dg/ipa/pr85449.c: New test. From-SVN: r259518 --- gcc/ChangeLog | 6 ++ gcc/ipa-cp.c | 11 +++- gcc/testsuite/ChangeLog | 5 ++ gcc/testsuite/gcc.dg/ipa/pr85449.c | 90 ++++++++++++++++++++++++++++++ 4 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/ipa/pr85449.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a2441991818..e06c6bc76cd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-04-20 Martin Jambor + + ipa/85449 + * ipa-cp.c (cgraph_edge_brings_value_p): Move check for self-feeding + recursion dependency to only apply to non-clones. + 2018-04-20 Martin Jambor ipa/85447 diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 9388482bbea..1b8f335fd32 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -3489,9 +3489,8 @@ cgraph_edge_brings_value_p (cgraph_edge *cs, ipcp_value_source *src, || availability <= AVAIL_INTERPOSABLE || caller_info->node_dead) return false; - /* At the moment we do not propagate over arithmetic jump functions in SCCs, - so it is safe to detect self-feeding recursive calls in this way. */ - if (!src->val || src->val == dest_val) + + if (!src->val) return true; if (caller_info->ipcp_orig_node) @@ -3506,6 +3505,12 @@ cgraph_edge_brings_value_p (cgraph_edge *cs, ipcp_value_source *src, } else { + /* At the moment we do not propagate over arithmetic jump functions in + SCCs, so it is safe to detect self-feeding recursive calls in this + way. */ + if (src->val == dest_val) + return true; + struct ipcp_agg_lattice *aglat; struct ipcp_param_lattices *plats = ipa_get_parm_lattices (caller_info, src->index); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 92b40feafdf..4e66877a9b1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-04-20 Martin Jambor + + ipa/85449 + * gcc.dg/ipa/pr85449.c: New test. + 2018-04-20 Martin Jambor ipa/85447 diff --git a/gcc/testsuite/gcc.dg/ipa/pr85449.c b/gcc/testsuite/gcc.dg/ipa/pr85449.c new file mode 100644 index 00000000000..57dfce263de --- /dev/null +++ b/gcc/testsuite/gcc.dg/ipa/pr85449.c @@ -0,0 +1,90 @@ +/* { dg-do run } */ +/* { dg-options "-O3 -fno-early-inlining" } */ + +int array[128]; + +volatile int v = 0; +volatile int blah = 0; + +int __attribute__((noipa)) +obscured_zero () +{ + return 0; +} + +int __attribute__((noipa)) +obscured_one () +{ + return 1; +} + +int __attribute__((noipa)) +obscured_two () +{ + return 2; +} + +static +void cb1 (int l) +{ + v = 25; +} + +static +void cb2 (int l) +{ + v = 125; +} + +typedef void (*silly_callback)(int); + +silly_callback __attribute__((noipa)) +get_callback () +{ + return cb1; +} + +static void +f (int c, int l, silly_callback p) +{ + int i; + + for (i = 0; i < c; i++) + array[i] = 455; + + for (i = 0; i < 200; i++) + { + p (l); + if (obscured_one ()) + break; + } + + if (l > 0) + f (c * 2, l - 1, p); + blah = l; +} + +int +main (int argc, char *argv[]) +{ + int i; + for (i = 0; i < 1000; i++) + { + f (0, 5, get_callback ()); + if (v != 25) + __builtin_abort (); + if (obscured_one ()) + break; + } + + for (i = 0; i < 1000; i++) + { + f (obscured_zero (), obscured_two (), cb2); + if (v != 125) + __builtin_abort (); + if (obscured_one ()) + break; + } + + return 0; +} -- 2.30.2