about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2018-01-28 10:41:34 +0000
committerbors <bors@rust-lang.org>2018-01-28 10:41:34 +0000
commit0119b44270243db7479ea946bb0cdd5522c351b6 (patch)
tree9fba28fff4620615ab62b95014a4f78646033842
parent7046a406232695b581579f8e2468601260ea2199 (diff)
parent4f7109a42482e266410b23fedc9643a6d76e5fa5 (diff)
downloadrust-0119b44270243db7479ea946bb0cdd5522c351b6.tar.gz
rust-0119b44270243db7479ea946bb0cdd5522c351b6.zip
Auto merge of #47772 - arthurprs:iter-position-bounds-check, r=dtolnay
Use the slice length to hint the optimizer about iter.position result

Using the len of the iterator doesn't give the same result.
That's also why we can't generalize it to all TrustedLen iterators.

Problem demo: https://godbolt.org/g/MXg2ae
Fix demo: https://godbolt.org/g/P8q5aZ

Second attempt of #47333
Third attempt of #45501
Fixes #45964
-rw-r--r--src/libcore/slice/mod.rs6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/libcore/slice/mod.rs b/src/libcore/slice/mod.rs
index 244bf476caf..aacbbd5058e 100644
--- a/src/libcore/slice/mod.rs
+++ b/src/libcore/slice/mod.rs
@@ -1245,7 +1245,8 @@ macro_rules! iterator {
                 P: FnMut(Self::Item) -> bool,
             {
                 // The addition might panic on overflow
-                let n = self.len();
+                // Use the len of the slice to hint optimizer to remove result index bounds check.
+                let n = make_slice!(self.ptr, self.end).len();
                 self.try_fold(0, move |i, x| {
                     if predicate(x) { Err(i) }
                     else { Ok(i + 1) }
@@ -1263,7 +1264,8 @@ macro_rules! iterator {
             {
                 // No need for an overflow check here, because `ExactSizeIterator`
                 // implies that the number of elements fits into a `usize`.
-                let n = self.len();
+                // Use the len of the slice to hint optimizer to remove result index bounds check.
+                let n = make_slice!(self.ptr, self.end).len();
                 self.try_rfold(n, move |i, x| {
                     let i = i - 1;
                     if predicate(x) { Err(i) }