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
This commit is contained in:
bors 2018-01-28 10:41:34 +00:00
commit 0119b44270

View File

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