https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93203

--- Comment #1 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Feng Xue <f...@gcc.gnu.org>:

https://gcc.gnu.org/g:a0f6a8cb414b687f22c9011a894d5e8e398c4be0

commit r10-6540-ga0f6a8cb414b687f22c9011a894d5e8e398c4be0
Author: Feng Xue <f...@os.amperecomputing.com>
Date:   Tue Jan 21 20:53:38 2020 +0800

    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  <f...@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.

Reply via email to