diff options
| author | bors <bors@rust-lang.org> | 2023-11-24 11:19:34 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2023-11-24 11:19:34 +0000 |
| commit | b06258cde4b0dd131cdbf289349ebf51b3b6388a (patch) | |
| tree | 094d38db3a31a4952dab9bdc00fc4df8bec1b8b3 /tests/ui/parser/removed-syntax-mode.rs | |
| parent | f74f700952f105536446e415b8df8061bddfb25e (diff) | |
| parent | b81e788d16d9656b9fd8905de9a3f382ccdbb56c (diff) | |
| download | rust-b06258cde4b0dd131cdbf289349ebf51b3b6388a.tar.gz rust-b06258cde4b0dd131cdbf289349ebf51b3b6388a.zip | |
Auto merge of #118228 - Mark-Simulacrum:alloc-opt, r=scottmcm
Indicate that multiplication in Layout::array cannot overflow
Since https://github.com/rust-lang/rust/pull/113113, we have added a check that skips calling into the allocator at all if `capacity == 0`. The global, default allocator will not actually try to allocate though; it returns a dangling pointer explicitly. However, these two checks are not merged/deduplicated by LLVM and so we're comparing to zero twice whenever vectors are allocated/grown. Probably cheap, but also potentially expensive in code size and seems like an unfortunate miss.
This removes that extra check by telling LLVM that the multiplication as part of Layout::array can't overflow, turning the original non-zero value into a zero value afterwards. In my checks locally this successfully drops the duplicate comparisons.
See https://rust.godbolt.org/z/b6nPP9dcK for a code example.
```rust
pub fn foo(elements: usize) -> Vec<u32> {
Vec::with_capacity(elements)
}
```
r? `@scottmcm` since you touched this in a32305a80fd1409b054e97836321bd0621b142fd - curious if you have thoughts on doing this / can confirm my model of this being correct.
Diffstat (limited to 'tests/ui/parser/removed-syntax-mode.rs')
0 files changed, 0 insertions, 0 deletions
