From 76a80492489b9081944c6da793c509c4ad82f813 Mon Sep 17 00:00:00 2001
From: Stein Somers <git@steinsomers.be>
Date: Thu, 23 Jul 2020 20:15:47 +0200
Subject: [PATCH] Optimize btree's unwrap_unchecked

---
 library/alloc/src/collections/btree/mod.rs | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/library/alloc/src/collections/btree/mod.rs b/library/alloc/src/collections/btree/mod.rs
index 543ff41a4d48d..36511a23581a0 100644
--- a/library/alloc/src/collections/btree/mod.rs
+++ b/library/alloc/src/collections/btree/mod.rs
@@ -13,15 +13,16 @@ trait Recover<Q: ?Sized> {
     fn replace(&mut self, key: Self::Key) -> Option<Self::Key>;
 }
 
+/// Same purpose as `Option::unwrap` but doesn't always guarantee a panic
+/// if the option contains no value.
+/// SAFETY: the caller must ensure that the option contains a value.
 #[inline(always)]
 pub unsafe fn unwrap_unchecked<T>(val: Option<T>) -> T {
-    val.unwrap_or_else(|| {
-        if cfg!(debug_assertions) {
-            panic!("'unchecked' unwrap on None in BTreeMap");
-        } else {
-            unsafe {
-                core::intrinsics::unreachable();
-            }
-        }
-    })
+    if cfg!(debug_assertions) {
+        val.expect("'unchecked' unwrap on None in BTreeMap")
+    } else {
+        val.unwrap()
+        // val.unwrap_or_else(|| unsafe { core::hint::unreachable_unchecked() })
+        // ...is considerably slower
+    }
 }