Skip to content

Commit

Permalink
Auto merge of rust-lang#122976 - caibear:optimize_reserve_for_push, r…
Browse files Browse the repository at this point in the history
…=cuviper

Remove len argument from RawVec::reserve_for_push

Removes `RawVec::reserve_for_push`'s `len` argument since it's always the same as capacity.
Also makes `Vec::insert` use `RawVec::reserve_for_push`.
  • Loading branch information
bors committed Mar 30, 2024
2 parents a3cfa03 + 4500c83 commit 877d36b
Show file tree
Hide file tree
Showing 4 changed files with 10 additions and 10 deletions.
2 changes: 1 addition & 1 deletion library/alloc/src/collections/vec_deque/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2087,7 +2087,7 @@ impl<T, A: Allocator> VecDeque<T, A> {
// buffer without it being full emerge
debug_assert!(self.is_full());
let old_cap = self.capacity();
self.buf.reserve_for_push(old_cap);
self.buf.grow_one();
unsafe {
self.handle_capacity_increase(old_cap);
}
Expand Down
8 changes: 4 additions & 4 deletions library/alloc/src/raw_vec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -345,12 +345,12 @@ impl<T, A: Allocator> RawVec<T, A> {
}
}

/// A specialized version of `reserve()` used only by the hot and
/// oft-instantiated `Vec::push()`, which does its own capacity check.
/// A specialized version of `self.reserve(len, 1)` which requires the
/// caller to ensure `len == self.capacity()`.
#[cfg(not(no_global_oom_handling))]
#[inline(never)]
pub fn reserve_for_push(&mut self, len: usize) {
if let Err(err) = self.grow_amortized(len, 1) {
pub fn grow_one(&mut self) {
if let Err(err) = self.grow_amortized(self.cap.0, 1) {
handle_error(err);
}
}
Expand Down
4 changes: 2 additions & 2 deletions library/alloc/src/vec/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1547,7 +1547,7 @@ impl<T, A: Allocator> Vec<T, A> {

// space for the new element
if len == self.buf.capacity() {
self.reserve(1);
self.buf.grow_one();
}

unsafe {
Expand Down Expand Up @@ -1967,7 +1967,7 @@ impl<T, A: Allocator> Vec<T, A> {
// This will panic or abort if we would allocate > isize::MAX bytes
// or if the length increment would overflow for zero-sized types.
if self.len == self.buf.capacity() {
self.buf.reserve_for_push(self.len);
self.buf.grow_one();
}
unsafe {
let end = self.as_mut_ptr().add(self.len);
Expand Down
6 changes: 3 additions & 3 deletions tests/codegen/vec_pop_push_noop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
#[no_mangle]
// CHECK-LABEL: @noop(
pub fn noop(v: &mut Vec<u8>) {
// CHECK-NOT: reserve_for_push
// CHECK-NOT: grow_one
// CHECK-NOT: call
// CHECK: tail call void @llvm.assume
// CHECK-NOT: reserve_for_push
// CHECK-NOT: grow_one
// CHECK-NOT: call
// CHECK: ret
if let Some(x) = v.pop() {
Expand All @@ -19,6 +19,6 @@ pub fn noop(v: &mut Vec<u8>) {
#[no_mangle]
// CHECK-LABEL: @push_byte(
pub fn push_byte(v: &mut Vec<u8>) {
// CHECK: call {{.*}}reserve_for_push
// CHECK: call {{.*}}grow_one
v.push(3);
}

0 comments on commit 877d36b

Please sign in to comment.