@@ -292,6 +292,13 @@ impl<T, A: Allocator> RawVec<T, A> {
292292 if self.needs_to_grow(len, additional) {
293293 do_reserve_and_handle(self, len, additional);
294294 }
295+
296+ // SAFETY: The call to `do_reserve_and_handle` ensured this
297+ // (or it panicked) and thus the addition cannot overflow.
298+ unsafe {
299+ // Inform the optimizer that the reservation has succeeded or wasn't needed
300+ core::intrinsics::assume(!self.needs_to_grow(len, additional));
301+ }
295302 }
296303
297304 /// A specialized version of `reserve()` used only by the hot and
@@ -305,10 +312,13 @@ impl<T, A: Allocator> RawVec<T, A> {
305312 /// The same as `reserve`, but returns on errors instead of panicking or aborting.
306313 pub fn try_reserve(&mut self, len: usize, additional: usize) -> Result<(), TryReserveError> {
307314 if self.needs_to_grow(len, additional) {
308- self.grow_amortized(len, additional)
309- } else {
310- Ok(())
315+ self.grow_amortized(len, additional)?;
316+ }
317+ unsafe {
318+ // Inform the optimizer that the reservation has succeeded or wasn't needed
319+ core::intrinsics::assume(!self.needs_to_grow(len, additional));
311320 }
321+ Ok(())
312322 }
313323
314324 /// Ensures that the buffer contains at least enough space to hold `len +
@@ -339,7 +349,14 @@ impl<T, A: Allocator> RawVec<T, A> {
339349 len: usize,
340350 additional: usize,
341351 ) -> Result<(), TryReserveError> {
342- if self.needs_to_grow(len, additional) { self.grow_exact(len, additional) } else { Ok(()) }
352+ if self.needs_to_grow(len, additional) {
353+ self.grow_exact(len, additional)?;
354+ }
355+ unsafe {
356+ // Inform the optimizer that the reservation has succeeded or wasn't needed
357+ core::intrinsics::assume(!self.needs_to_grow(len, additional));
358+ }
359+ Ok(())
343360 }
344361
345362 /// Shrinks the buffer down to the specified capacity. If the given amount
0 commit comments