diff options
author | Feng Xue <fxue@os.amperecomputing.com> | 2020-02-17 17:07:04 +0800 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 2020-02-21 13:22:20 -0700 |
commit | 47772af10c00f7e1e95cd52557fc893dc602a420 (patch) | |
tree | d7da2bfb62c51381fef0882ce16fa1889d23d983 /gcc | |
parent | 147add96091790d5c1d8eb938f84ea775ad81b84 (diff) | |
download | gcc-47772af10c00f7e1e95cd52557fc893dc602a420.zip gcc-47772af10c00f7e1e95cd52557fc893dc602a420.tar.gz gcc-47772af10c00f7e1e95cd52557fc893dc602a420.tar.bz2 |
Do not propagate self-dependent value (PR ipa/93763)
PR ipa/93763
* ipa-cp.c (self_recursively_generated_p): Mark self-dependent value as
self-recursively generated.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ipa-cp.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ipa/pr93763.C | 15 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/ipa/pr93763.c | 46 |
3 files changed, 67 insertions, 4 deletions
diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c index 4f5b72e..1d0c1ac 100644 --- a/gcc/ipa-cp.c +++ b/gcc/ipa-cp.c @@ -1897,8 +1897,8 @@ ipcp_lattice<valtype>::add_value (valtype newval, cgraph_edge *cs, } /* Return true, if a ipcp_value VAL is orginated from parameter value of - self-feeding recursive function by applying non-passthrough arithmetic - transformation. */ + self-feeding recursive function via some kind of pass-through jump + function. */ static bool self_recursively_generated_p (ipcp_value<tree> *val) @@ -1909,10 +1909,12 @@ self_recursively_generated_p (ipcp_value<tree> *val) { cgraph_edge *cs = src->cs; - if (!src->val || cs->caller != cs->callee->function_symbol () - || src->val == val) + if (!src->val || cs->caller != cs->callee->function_symbol ()) return false; + if (src->val == val) + continue; + if (!info) info = IPA_NODE_REF (cs->caller); diff --git a/gcc/testsuite/g++.dg/ipa/pr93763.C b/gcc/testsuite/g++.dg/ipa/pr93763.C new file mode 100644 index 0000000..6111710 --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/pr93763.C @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-options "-O3" } */ + +struct search_param { + int total; +}; +void search_trivial(search_param error_left) { + search_trivial(error_left); + search_param error_left2{error_left}; + error_left2.total--; + search_trivial(error_left2); +} +void search_algo_uni(search_param error_left) { search_trivial(error_left); } +void search_algo(search_param error_left) { search_algo_uni(error_left); } +int main() { search_algo({}); return 0; } diff --git a/gcc/testsuite/gcc.dg/ipa/pr93763.c b/gcc/testsuite/gcc.dg/ipa/pr93763.c new file mode 100644 index 0000000..d117059 --- /dev/null +++ b/gcc/testsuite/gcc.dg/ipa/pr93763.c @@ -0,0 +1,46 @@ +/* { dg-do compile } */ +/* { dg-options "-O3" } */ + +typedef struct a a; +struct a { + a *b +} d; +e, k, ah, al; +f(aa) { + if (aa & 1) + goto g; + f(aa | 2); +g: + h(); +} +l() { + { + f(072); + i(e, d, 92); + } +} +ag() { + { i(e, d, 36); } +} +ai(a *m, a *n, unsigned aa) { + f(aa); + j(k, l, ah, 1); +} +j(int c, a m, int aj, int aa) { + int ak = aa; + { i(e, d, ak); } +} +i(int c, a *m, unsigned aa) { + { + { i(c, (*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*( +*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*( +*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*(*m).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b) +.b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b) +.b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b) +.b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b) +.b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b).b, 0); + } + } + int am = aa; + ai(ag, al, am); +} |