aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/init.c
diff options
context:
space:
mode:
authorFeng Xue <fxue@os.amperecomputing.com>2020-01-21 20:53:38 +0800
committerFeng Xue <fxue@os.amperecomputing.com>2020-02-10 12:31:09 +0800
commita0f6a8cb414b687f22c9011a894d5e8e398c4be0 (patch)
tree02bdac0426a20aabff5f849b5ead4570e26b7652 /gcc/cp/init.c
parent04c3a1f2c6e9813bf13e573924dce94e22c72c85 (diff)
downloadgcc-a0f6a8cb414b687f22c9011a894d5e8e398c4be0.zip
gcc-a0f6a8cb414b687f22c9011a894d5e8e398c4be0.tar.gz
gcc-a0f6a8cb414b687f22c9011a894d5e8e398c4be0.tar.bz2
Generalized value pass-through for self-recusive function (PR ipa/93203)
Besides simple pass-through (aggregate) jump function, arithmetic (aggregate) jump function could also bring same (aggregate) value as parameter passed-in for self-feeding recursive call. For example, f1 (int i) /* normal jump function */ { f1 (i & 1); } Suppose i is 0, recursive propagation via (i & 1) also gets 0, which can be seen as a simple pass-through of i. f2 (int *p) /* aggregate jump function */ { int t = *p & 1; f2 (&t); } Likewise, if *p is 0, (*p & 1) is also 0, and &t is an aggregate simple pass-through of p. 2020-02-10 Feng Xue <fxue@os.amperecomputing.com> PR ipa/93203 * ipa-cp.c (ipcp_lattice::add_value): Add source with same call edge but different source value. (adjust_callers_for_value_intersection): New function. (gather_edges_for_value): Adjust order of callers to let a non-self-recursive caller be the first element. (self_recursive_pass_through_p): Add a new parameter "simple", and check generalized self-recursive pass-through jump function. (self_recursive_agg_pass_through_p): Likewise. (find_more_scalar_values_for_callers_subset): Compute value from pass-through jump function for self-recursive. (intersect_with_plats): Cleanup previous implementation code for value itersection with self-recursive call edge. (intersect_with_agg_replacements): Likewise. (intersect_aggregates_with_edge): Deduce value from pass-through jump function for self-recursive call edge. Cleanup previous implementation code for value intersection with self-recursive call edge. (decide_whether_version_node): Remove dead callers and adjust order to let a non-self-recursive caller be the first element. PR ipa/93203 * g++.dg/ipa/pr93203.C: New test.
Diffstat (limited to 'gcc/cp/init.c')
0 files changed, 0 insertions, 0 deletions