aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vectorizer.c
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2020-05-04 18:30:32 -0400
committerPatrick Palka <ppalka@redhat.com>2020-05-04 18:30:32 -0400
commita700b4a9f18fd6213de51f4259ee9a8ce7eefdbb (patch)
tree174acbc7d42a694b31c00c910aeeb73cf9bcdb52 /gcc/tree-vectorizer.c
parent1405ed433443c7df22364ef8c6574bbf9b10b61a (diff)
downloadgcc-a700b4a9f18fd6213de51f4259ee9a8ce7eefdbb.zip
gcc-a700b4a9f18fd6213de51f4259ee9a8ce7eefdbb.tar.gz
gcc-a700b4a9f18fd6213de51f4259ee9a8ce7eefdbb.tar.bz2
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.
Diffstat (limited to 'gcc/tree-vectorizer.c')
0 files changed, 0 insertions, 0 deletions