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

--- Comment #9 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Martin Jambor <[email protected]>:

https://gcc.gnu.org/g:8d7dc3ed288b9fec82721b432d5b683ffade0b1b

commit r17-2280-g8d7dc3ed288b9fec82721b432d5b683ffade0b1b
Author: Martin Jambor <[email protected]>
Date:   Thu Jul 9 17:17:50 2026 +0200

    ipa-cp: Only create all-context nodes for local cgraph nodes (PR125207)

    IPA-CP contains special logic to create specially marked clones with
    constants that come from all callees (that are constant in all
    contexts).  In the past that was the only case in which the heuristics
    tried to assess the effect of multiple constants at once (that is no
    longer true since GCC 16) and they are also useful when we realize we
    can refine them still further in the case of recursive calls (such as
    in testsuite/gcc.dg/ipa/pr93707.c) turn to carry more constants after
    the initial "all-context" clone is created.

    Unfortunately, the code creating the clones simply redirects all
    incoming call graph edges which may include those which were indirect
    in the phase of the algorithm which gathered IPA-CP lattices and the
    arguments in these calls might contain different values than all
    initially known ones, leading to miscompilations like the one in
    PR125207.

    Since GCC 16 already feeds the heuristics with all known constants
    that are passed along with the constant the evaluation was initiated
    for, the all-context nodes are really only necessary for the recursive
    refinement cases described above.  It seems appropriate to only create
    them when they are what they are called, when there can be no indirect
    or unknown calls to them, i.e. when they are local.  This has the nice
    effect of simplifying decide_whether_version_node somewhat.

    There is some testsuite fallout.  First, IPA-CP will now no longer
    clone a non-static function to only remove a (non-constant) parameter.
    This likely only makes sense with tiny values of param
    ipa-cp-eval-threshold or very small functions which are likely going
    to be inlined anyway.  But gcc.dg/vla-1.c expected that to happen so I
    made the function to be cloned static.

    The testcase libgomp.c/ipcp-cb-spec1.c stopped working for the same
    reason (the outlined task body has its address taken) but looking into
    the dumps the test does not seem to test what it is supposed to, the
    test function was completely eliminated before IPA.  I have therefore
    changed it to really propagate constants.

    gcc/ChangeLog:

    2026-06-02  Martin Jambor  <[email protected]>

            PR ipa/125207
            * ipa-cp.cc (decide_about_value): Add detailed dumping about
skipping
            a value when there are no edges for it.  Make dumping about
skipping
            because of growth limit violation consistent with other cases.
            (decide_whether_version_node): Only create all-context nodes for
local
            nodes, remove the logic doing it in other cases, allow cloning for
            single constant lattices for non-local nodes.  Adjust dumping.

    gcc/testsuite/ChangeLog:

    2026-06-02  Martin Jambor  <[email protected]>

            PR ipa/125207
            * gcc.dg/ipa/pr125207.c: New test.
            * gcc.dg/vla-1.c (f1): Make function f1 static.

    libgomp/ChangeLog:

    2026-06-03  Martin Jambor  <[email protected]>

            PR ipa/125207
            * testsuite/libgomp.c/ipcp-cb-spec1.c (test): Rework.

Reply via email to