Optimize 'construct at end' loops in vector
authorMartijn Vels <mvels@google.com>
Thu, 18 Jun 2020 17:14:02 +0000 (13:14 -0400)
committerMartijn Vels <mvels@google.com>
Thu, 18 Jun 2020 17:51:12 +0000 (13:51 -0400)
commitd96aac435423b550840afae79315bda98953214e
treeb0fb1cd6589537b59f49f89d77a34c50e8f8e8ed
parent9cb10296ecaa2d7131744375e8b14200674fa1e5
Optimize 'construct at end' loops in vector

Summary:
This change adds local 'end' and 'pos' variables for the main loop inmstead of using the ConstructTransaction variables directly.

We observed that not all vector initialization and resize operations got properly vectorized, i.e., (partially) unrolled into XMM stores for floats.

For example, `vector<int32_t> v(n, 1)` gets vectorized, but `vector<float> v(n, 1)`. It looks like the compiler assumes the state is leaked / aliased in the latter case (unclear how/why for float, but not for int32), and because of this fails to see vectorization optimization?

See https://gcc.godbolt.org/z/UWhiie

By using a local `__new_end_` (fixed), and local `__pos` (copied into __tx.__pos_ per iteration), we offer the compiler a clean loop for unrolling.

A demonstration can be seen in the isolated logic in https://gcc.godbolt.org/z/KoCNWv

The com

Reviewers: EricWF, #libc!

Subscribers: libcxx-commits

Tags: #libc

Differential Revision: https://reviews.llvm.org/D82111
libcxx/include/vector