diff options
author | Konstantin Varlamov <varconst@apple.com> | 2022-10-01 17:28:57 -0700 |
---|---|---|
committer | Konstantin Varlamov <varconst@apple.com> | 2022-10-01 17:35:12 -0700 |
commit | 005916de58f73aa5c4264c084ba7b0e21040d88f (patch) | |
tree | 8c1147716db984d8c99b0032389216d1652f63b6 /flang/lib/Frontend/CompilerInvocation.cpp | |
parent | 240f41c8e45186ea8f781dad7caed789a34f215c (diff) | |
download | llvm-005916de58f73aa5c4264c084ba7b0e21040d88f.zip llvm-005916de58f73aa5c4264c084ba7b0e21040d88f.tar.gz llvm-005916de58f73aa5c4264c084ba7b0e21040d88f.tar.bz2 |
[libc++][ranges]Refactor `copy{,_backward}` and `move{,_backward}`
Instead of using `reverse_iterator`, share the optimization between the 4 algorithms. The key observation here that `memmove` applies to both `copy` and `move` identically, and to their `_backward` versions very similarly. All algorithms now follow the same pattern along the lines of:
```
if constexpr (can_memmove<InIter, OutIter>) {
memmove(first, last, out);
} else {
naive_implementation(first, last, out);
}
```
A follow-up will delete `unconstrained_reverse_iterator`.
This patch removes duplication and divergence between `std::copy`, `std::move` and `std::move_backward`. It also improves testing:
- the test for whether the optimization is used only applied to `std::copy` and, more importantly, was essentially a no-op because it would still pass if the optimization was not used;
- there were no tests to make sure the optimization is not used when the effect would be visible.
Differential Revision: https://reviews.llvm.org/D130695
Diffstat (limited to 'flang/lib/Frontend/CompilerInvocation.cpp')
0 files changed, 0 insertions, 0 deletions