mirror of
https://github.com/darlinghq/darling-libcxx.git
synced 2024-12-03 17:41:36 +00:00
e7f817d01d
The optimizer is petulant and temperamental. In this case LLVM failed to lower the the "insert at end" loop used by`vector<unsigned char>` to a `memset` despite `memset` being substantially faster over a range of bytes. LLVM has the ability to lower loops to `memset` whet appropriate, but the odd nature of libc++'s loops prevented the optimization from taking places. This patch addresses the issue by rewriting the loops from the form `do [ ... --__n; } while (__n > 0);` to instead use a for loop over a pointer range (For example: `for (auto *__i = ...; __i < __e; ++__i)`). This patch also rewrites the asan annotations to unposion all additional memory at the start of the loop instead of once per iterations. This could potentially permit false negatives where the constructor of element N attempts to access element N + 1 during its construction. The before and after results for the `BM_ConstructSize/vector_byte/5140480_mean` benchmark (run 5 times) are: -------------------------------------------------------------------------------------------- Benchmark Time CPU Iterations -------------------------------------------------------------------------------------------- Before ------ BM_ConstructSize/vector_byte/5140480_mean 12530140 ns 12469693 ns N/A BM_ConstructSize/vector_byte/5140480_median 12512818 ns 12445571 ns N/A BM_ConstructSize/vector_byte/5140480_stddev 106224 ns 107907 ns 5 ----- After ----- BM_ConstructSize/vector_byte/5140480_mean 167285 ns 166500 ns N/A BM_ConstructSize/vector_byte/5140480_median 166749 ns 166069 ns N/A BM_ConstructSize/vector_byte/5140480_stddev 3242 ns 3184 ns 5 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@367183 91177308-0d34-0410-b5e6-96231b3b80d8 |
||
---|---|---|
.. | ||
algorithms.bench.cpp | ||
algorithms.partition_point.bench.cpp | ||
CartesianBenchmarks.hpp | ||
CMakeLists.txt | ||
ContainerBenchmarks.hpp | ||
filesystem.bench.cpp | ||
function.bench.cpp | ||
GenerateInput.hpp | ||
lit.cfg.py | ||
lit.site.cfg.py.in | ||
ordered_set.bench.cpp | ||
string.bench.cpp | ||
stringstream.bench.cpp | ||
unordered_set_operations.bench.cpp | ||
util_smartptr.bench.cpp | ||
vector_operations.bench.cpp |