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

--- Comment #4 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Patrick Palka <ppa...@gcc.gnu.org>:

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

commit r11-56-ga700b4a9f18fd6213de51f4259ee9a8ce7eefdbb
Author: Patrick Palka <ppa...@redhat.com>
Date:   Mon May 4 18:30:32 2020 -0400

    c++: Avoid unnecessary copying in cp_fold [PR94038]

    When folding a CALL_EXPR, we can avoid copying it until folding changes
    one of its arguments.  And when folding a TREE_VEC, we can avoid using
    an intermediate releasing_vec by copying the TREE_VEC as soon as folding
    changes one of its arguments, like we do in the CALL_EXPR case.

    Incidentally, the CALL_EXPR change also fixes the testcase in PR94038.
    The reason is that the call to maybe_constant_value from cp_fold on
    the call 'bar<int>()' now reuses the result of the earlier call to
    maybe_constant_value from fold_for_warn, via the cv_cache.  This earlier
    call passes uid_sensitive=true, whereas the call from cp_fold passes
    uid_sensitive=false, and so by reusing the cached result of the earlier
    call we now avoid instantiating bar<int> at all.

    gcc/cp/ChangeLog:

            PR c++/94038
            * cp-gimplify.c (cp_fold) <case CALL_EXPR>: Move some variable
            declarations closer to their uses.  Copy the CALL_EXPR only
            when one of its arguments has changed.
            <case TREE_VEC>: Instead of first collecting the folded
            arguments into a releasing_vec, just make a copy of the TREE_VEC
            as soon as folding changes one of its arguments.

    gcc/testsuite/ChangeLog:

            PR c++/94038
            * g++.dg/warn/pr94038.C: New test.

Reply via email to