Skip to content

Commit 9140c9a

Browse files
committed
Add a mir test for slice::Iter::is_empty
1 parent acb6273 commit 9140c9a

File tree

3 files changed

+182
-0
lines changed

3 files changed

+182
-0
lines changed

tests/mir-opt/pre-codegen/slice_iter.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// EMIT_MIR_FOR_EACH_PANIC_STRATEGY
44

55
#![crate_type = "lib"]
6+
#![feature(exact_size_is_empty)]
67

78
// When this test was added, the MIR for `next` was 174 lines just for the basic
89
// blocks -- far more if you counted the scopes. The goal of having this here
@@ -13,6 +14,11 @@
1314
// As such, feel free to `--bless` whatever changes you get here, so long as
1415
// doing so doesn't add substantially more MIR.
1516

17+
// EMIT_MIR slice_iter.slice_iter_generic_is_empty.PreCodegen.after.mir
18+
pub fn slice_iter_generic_is_empty<T>(it: &std::slice::Iter<'_, T>) -> bool {
19+
it.is_empty()
20+
}
21+
1622
// EMIT_MIR slice_iter.slice_iter_next.PreCodegen.after.mir
1723
pub fn slice_iter_next<'a, T>(it: &mut std::slice::Iter<'a, T>) -> Option<&'a T> {
1824
it.next()
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
// MIR for `slice_iter_generic_is_empty` after PreCodegen
2+
3+
fn slice_iter_generic_is_empty(_1: &std::slice::Iter<'_, T>) -> bool {
4+
debug it => _1;
5+
let mut _0: bool;
6+
scope 1 (inlined <std::slice::Iter<'_, T> as ExactSizeIterator>::is_empty) {
7+
let mut _2: *const *const T;
8+
let mut _3: *const std::ptr::NonNull<T>;
9+
let mut _10: *const T;
10+
scope 2 {
11+
let _4: std::ptr::NonNull<T>;
12+
let _12: usize;
13+
scope 3 {
14+
}
15+
scope 4 {
16+
scope 8 (inlined <NonNull<T> as PartialEq>::eq) {
17+
let mut _5: std::ptr::NonNull<T>;
18+
let mut _7: *mut T;
19+
let mut _9: *mut T;
20+
scope 9 (inlined NonNull::<T>::as_ptr) {
21+
let mut _6: *const T;
22+
}
23+
scope 10 (inlined NonNull::<T>::as_ptr) {
24+
let mut _8: *const T;
25+
}
26+
}
27+
}
28+
scope 5 (inlined std::ptr::const_ptr::<impl *const T>::addr) {
29+
let mut _11: *const ();
30+
scope 6 (inlined std::ptr::const_ptr::<impl *const T>::cast::<()>) {
31+
}
32+
}
33+
scope 7 (inlined std::ptr::const_ptr::<impl *const *const T>::cast::<NonNull<T>>) {
34+
}
35+
}
36+
}
37+
38+
bb0: {
39+
StorageLive(_12);
40+
StorageLive(_4);
41+
switchInt(const <T as std::mem::SizedTypeProperties>::IS_ZST) -> [0: bb1, otherwise: bb2];
42+
}
43+
44+
bb1: {
45+
StorageLive(_3);
46+
StorageLive(_2);
47+
_2 = &raw const ((*_1).1: *const T);
48+
_3 = _2 as *const std::ptr::NonNull<T> (PtrToPtr);
49+
StorageDead(_2);
50+
_4 = (*_3);
51+
StorageDead(_3);
52+
StorageLive(_7);
53+
StorageLive(_5);
54+
_5 = ((*_1).0: std::ptr::NonNull<T>);
55+
StorageLive(_6);
56+
_6 = (_5.0: *const T);
57+
_7 = move _6 as *mut T (PtrToPtr);
58+
StorageDead(_6);
59+
StorageDead(_5);
60+
StorageLive(_9);
61+
StorageLive(_8);
62+
_8 = (_4.0: *const T);
63+
_9 = move _8 as *mut T (PtrToPtr);
64+
StorageDead(_8);
65+
_0 = Eq(move _7, move _9);
66+
StorageDead(_9);
67+
StorageDead(_7);
68+
goto -> bb3;
69+
}
70+
71+
bb2: {
72+
StorageLive(_10);
73+
_10 = ((*_1).1: *const T);
74+
StorageLive(_11);
75+
_11 = _10 as *const () (PtrToPtr);
76+
_12 = move _11 as usize (Transmute);
77+
StorageDead(_11);
78+
StorageDead(_10);
79+
_0 = Eq(_12, const 0_usize);
80+
goto -> bb3;
81+
}
82+
83+
bb3: {
84+
StorageDead(_4);
85+
StorageDead(_12);
86+
return;
87+
}
88+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
// MIR for `slice_iter_generic_is_empty` after PreCodegen
2+
3+
fn slice_iter_generic_is_empty(_1: &std::slice::Iter<'_, T>) -> bool {
4+
debug it => _1;
5+
let mut _0: bool;
6+
scope 1 (inlined <std::slice::Iter<'_, T> as ExactSizeIterator>::is_empty) {
7+
let mut _2: *const *const T;
8+
let mut _3: *const std::ptr::NonNull<T>;
9+
let mut _10: *const T;
10+
scope 2 {
11+
let _4: std::ptr::NonNull<T>;
12+
let _12: usize;
13+
scope 3 {
14+
}
15+
scope 4 {
16+
scope 8 (inlined <NonNull<T> as PartialEq>::eq) {
17+
let mut _5: std::ptr::NonNull<T>;
18+
let mut _7: *mut T;
19+
let mut _9: *mut T;
20+
scope 9 (inlined NonNull::<T>::as_ptr) {
21+
let mut _6: *const T;
22+
}
23+
scope 10 (inlined NonNull::<T>::as_ptr) {
24+
let mut _8: *const T;
25+
}
26+
}
27+
}
28+
scope 5 (inlined std::ptr::const_ptr::<impl *const T>::addr) {
29+
let mut _11: *const ();
30+
scope 6 (inlined std::ptr::const_ptr::<impl *const T>::cast::<()>) {
31+
}
32+
}
33+
scope 7 (inlined std::ptr::const_ptr::<impl *const *const T>::cast::<NonNull<T>>) {
34+
}
35+
}
36+
}
37+
38+
bb0: {
39+
StorageLive(_12);
40+
StorageLive(_4);
41+
switchInt(const <T as std::mem::SizedTypeProperties>::IS_ZST) -> [0: bb1, otherwise: bb2];
42+
}
43+
44+
bb1: {
45+
StorageLive(_3);
46+
StorageLive(_2);
47+
_2 = &raw const ((*_1).1: *const T);
48+
_3 = _2 as *const std::ptr::NonNull<T> (PtrToPtr);
49+
StorageDead(_2);
50+
_4 = (*_3);
51+
StorageDead(_3);
52+
StorageLive(_7);
53+
StorageLive(_5);
54+
_5 = ((*_1).0: std::ptr::NonNull<T>);
55+
StorageLive(_6);
56+
_6 = (_5.0: *const T);
57+
_7 = move _6 as *mut T (PtrToPtr);
58+
StorageDead(_6);
59+
StorageDead(_5);
60+
StorageLive(_9);
61+
StorageLive(_8);
62+
_8 = (_4.0: *const T);
63+
_9 = move _8 as *mut T (PtrToPtr);
64+
StorageDead(_8);
65+
_0 = Eq(move _7, move _9);
66+
StorageDead(_9);
67+
StorageDead(_7);
68+
goto -> bb3;
69+
}
70+
71+
bb2: {
72+
StorageLive(_10);
73+
_10 = ((*_1).1: *const T);
74+
StorageLive(_11);
75+
_11 = _10 as *const () (PtrToPtr);
76+
_12 = move _11 as usize (Transmute);
77+
StorageDead(_11);
78+
StorageDead(_10);
79+
_0 = Eq(_12, const 0_usize);
80+
goto -> bb3;
81+
}
82+
83+
bb3: {
84+
StorageDead(_4);
85+
StorageDead(_12);
86+
return;
87+
}
88+
}

0 commit comments

Comments
 (0)