Optimize 'construct at end' loops in vector

Authored by mvels on Jun 18 2020, 10:14 AM.

Unpublished Commit · Learn More

Not On Permanent Ref: This commit is not an ancestor of any permanent ref.
This commit no longer exists in the repository. It may have been part of a branch which was deleted.This commit has been deleted in the repository: it is no longer reachable from any branch, tag, or ref.


Optimize 'construct at end' loops in vector

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


mvelsJun 18 2020, 10:35 AM
Differential Revision
D82111: Optimize 'construct at end' loops in vector

Commit No Longer Exists

This commit no longer exists in the repository.