Skip to content

Commit 7412d1b

Browse files
committed
Eliminate excessive null-checks from slice iterators
The data pointer used in the slice is never null, using assume() to tell LLVM about it gets rid of various unneeded null checks when iterating over the slice. Since the snapshot compiler is still using an older LLVM version, omit the call in stage0, because compile times explode otherwise. Benchmarks from rust-lang#18193 ```` running 5 tests test _range ... bench: 33329 ns/iter (+/- 417) test assembly ... bench: 33299 ns/iter (+/- 58) test enumerate ... bench: 33318 ns/iter (+/- 83) test iter ... bench: 33311 ns/iter (+/- 130) test position ... bench: 33300 ns/iter (+/- 47) test result: ok. 0 passed; 0 failed; 0 ignored; 5 measured ```` Fixes rust-lang#18193
1 parent 52b5150 commit 7412d1b

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

src/libcollections/vec.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ use core::cmp::{Ordering};
5656
use core::default::Default;
5757
use core::fmt;
5858
use core::hash::{self, Hash};
59+
use core::intrinsics::assume;
5960
use core::iter::{repeat, FromIterator, IntoIterator};
6061
use core::marker::{self, ContravariantLifetime, InvariantType};
6162
use core::mem;
@@ -1587,8 +1588,12 @@ impl<T> AsSlice<T> for Vec<T> {
15871588
#[stable(feature = "rust1", since = "1.0.0")]
15881589
fn as_slice(&self) -> &[T] {
15891590
unsafe {
1591+
let p = *self.ptr;
1592+
if cfg!(not(stage0)) { // NOTE remove cfg after next snapshot
1593+
assume(p != 0 as *mut T);
1594+
}
15901595
mem::transmute(RawSlice {
1591-
data: *self.ptr,
1596+
data: p,
15921597
len: self.len
15931598
})
15941599
}

0 commit comments

Comments
 (0)