@@ -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