[all-commits] [llvm/llvm-project] bc9c1a: ADT: Make SmallVector::set_size() private
Duncan P. N. Exon Smith via All-commits
all-commits at lists.llvm.org
Thu Jan 13 10:50:57 PST 2022
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: bc9c1ae1c55d2f6d68d68b61543a0797e4248569
https://github.com/llvm/llvm-project/commit/bc9c1ae1c55d2f6d68d68b61543a0797e4248569
Author: Duncan P. N. Exon Smith <dexonsmith at apple.com>
Date: 2022-01-13 (Thu, 13 Jan 2022)
Changed paths:
M llvm/include/llvm/ADT/SmallVector.h
Log Message:
-----------
ADT: Make SmallVector::set_size() private
Stop allowing use of `SmallVectorBase::set_size()` outside of the
SmallVector implementation, which sets the size without calling
constructors or destructors.
Most callers should probably just use `resize()`. Or, if the new size is
guaranteed to be `<= size()`, then the new-ish `truncate()` works too
(and optimizes better).
Some callers want to avoid initializing memory before overwriting, but
need a pointer to the memory and so cannot use `push_back()`,
`emplace_back()`, or `append()`. Before this commit, this depended on
`reserve()` and `set_size()`:
```
V.reserve(V.size() + NumNew); // Reserve expected size.
NumNew = initialize(V.end(), ...); // Get number added.
V.set_size(V.size() + NumNew); // Set size to match.
```
Such code should be updated to use `resize_for_overwrite()` and
`truncate()`:
```
auto Size = V.size(); // Save initial size.
V.resize_for_overwrite(Size + NumNew); // Resize to expected size.
NumNew = initialize(V.begin() + Size, ...)); // Get number added.
V.truncate(Size + NumNew); // Truncate to match.
```
The new pattern is safe even for non-trivial types, since
`resize_for_overwrite()` calls constructors and `truncate()` calls
destructors. For trivial types, it should optimize the same way as the
old pattern.
Downstream code adapt to the disappearance of `set_size()` using this
new pattern should carefully audit uses of `V` between the resize and
the truncate:
- Change `V.size()` => `Size`.
- Change `V.capacity()` => `V.size()` (mostly).
- Change `V.end()` => `V.begin() + Size`.
- If `V` is an out-parameter, early returns need a `V.truncate()` or
`V.clear()`. A scope exit is recommended.
Differential Revision: https://reviews.llvm.org/D115380
More information about the All-commits
mailing list