about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNicholas Nethercote <nnethercote@mozilla.com>2020-06-29 19:08:47 +1000
committerNicholas Nethercote <nnethercote@mozilla.com>2020-06-30 14:38:57 +1000
commit3f79d2f33e8b69812c9b981ff4adea0a1e7b9cb8 (patch)
tree78c4a790294b76756da802a039b0582c3f4d14ef
parentc977b8775dd72d191ff1d8e8dceaf4b4cd5db86c (diff)
downloadrust-3f79d2f33e8b69812c9b981ff4adea0a1e7b9cb8.tar.gz
rust-3f79d2f33e8b69812c9b981ff4adea0a1e7b9cb8.zip
Avoid `unwrap_or_else` in `RawVec::allocate_in`.
This reduces the amount of LLVM IR generated by up to 1 or 2%.
-rw-r--r--src/liballoc/raw_vec.rs17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/liballoc/raw_vec.rs b/src/liballoc/raw_vec.rs
index 67ebdcc9f33..bcd7445ecf9 100644
--- a/src/liballoc/raw_vec.rs
+++ b/src/liballoc/raw_vec.rs
@@ -172,10 +172,21 @@ impl<T, A: AllocRef> RawVec<T, A> {
         if mem::size_of::<T>() == 0 {
             Self::new_in(alloc)
         } else {
-            let layout = Layout::array::<T>(capacity).unwrap_or_else(|_| capacity_overflow());
-            alloc_guard(layout.size()).unwrap_or_else(|_| capacity_overflow());
+            // We avoid `unwrap_or_else` here because it bloats the amount of
+            // LLVM IR generated.
+            let layout = match Layout::array::<T>(capacity) {
+                Ok(layout) => layout,
+                Err(_) => capacity_overflow(),
+            };
+            match alloc_guard(layout.size()) {
+                Ok(_) => {}
+                Err(_) => capacity_overflow(),
+            }
+            let memory = match alloc.alloc(layout, init) {
+                Ok(memory) => memory,
+                Err(_) => handle_alloc_error(layout),
+            };
 
-            let memory = alloc.alloc(layout, init).unwrap_or_else(|_| handle_alloc_error(layout));
             Self {
                 ptr: unsafe { Unique::new_unchecked(memory.ptr.cast().as_ptr()) },
                 cap: Self::capacity_from_bytes(memory.size),