diff options
author | Louis Dionne <ldionne.2@gmail.com> | 2020-11-24 12:29:08 -0500 |
---|---|---|
committer | Louis Dionne <ldionne.2@gmail.com> | 2020-12-01 12:49:45 -0500 |
commit | c30d5101f14f7e8a1c0f80c8663b54de2a7640fd (patch) | |
tree | 4f061d30488121bdd348b30dcb0398724b489bc3 | |
parent | e0bf2349303f6b40e3ddd5377ea08a5c0867ece4 (diff) | |
download | llvm-c30d5101f14f7e8a1c0f80c8663b54de2a7640fd.tar.gz |
[libc++] Optimize the number of assignments in std::exclusive_scan
Reported in https://twitter.com/blelbach/status/1169807347142676480
Differential Revision: https://reviews.llvm.org/D67273
-rw-r--r-- | libcxx/include/numeric | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/libcxx/include/numeric b/libcxx/include/numeric index 5c10dd3c1e67..ed06fcc49d5b 100644 --- a/libcxx/include/numeric +++ b/libcxx/include/numeric @@ -335,14 +335,17 @@ exclusive_scan(_InputIterator __first, _InputIterator __last, { if (__first != __last) { - _Tp __saved = __init; - do + _Tp __tmp(__b(__init, *__first)); + while (true) { - __init = __b(__init, *__first); - *__result = __saved; - __saved = __init; + *__result = _VSTD::move(__init); ++__result; - } while (++__first != __last); + ++__first; + if (__first == __last) + break; + __init = _VSTD::move(__tmp); + __tmp = __b(__init, *__first); + } } return __result; } |