11//@ compile-flags: -Copt-level=3
2+ //@ needs-deterministic-layouts (opposite scalar pair orders breaks it)
23#![ crate_type = "lib" ]
34
45type Demo = [ u8 ; 3 ] ;
@@ -7,7 +8,40 @@ type Demo = [u8; 3];
78#[ no_mangle]
89pub fn slice_iter_len_eq_zero ( y : std:: slice:: Iter < ' _ , Demo > ) -> bool {
910 // CHECK-NOT: sub
10- // CHECK: %[[RET:.+]] = icmp eq ptr {{%1|%0}}, {{%1|%0}}
11+ // CHECK: %[[RET:.+]] = icmp eq ptr {{%y.0, %y.1|%y.1, %y.0}}
12+ // CHECK: ret i1 %[[RET]]
13+ y. len ( ) == 0
14+ }
15+
16+ // CHECK-LABEL: @slice_iter_len_eq_zero_ref
17+ #[ no_mangle]
18+ pub fn slice_iter_len_eq_zero_ref ( y : & mut std:: slice:: Iter < ' _ , Demo > ) -> bool {
19+ // CHECK-NOT: sub
20+ // CHECK: %[[A:.+]] = load ptr
21+ // CHECK-SAME: !nonnull
22+ // CHECK: %[[B:.+]] = load ptr
23+ // CHECK-SAME: !nonnull
24+ // CHECK: %[[RET:.+]] = icmp eq ptr %[[A]], %[[B]]
25+ // CHECK: ret i1 %[[RET]]
26+ y. len ( ) == 0
27+ }
28+
29+ struct MyZST ;
30+
31+ // CHECK-LABEL: @slice_zst_iter_len_eq_zero
32+ #[ no_mangle]
33+ pub fn slice_zst_iter_len_eq_zero ( y : std:: slice:: Iter < ' _ , MyZST > ) -> bool {
34+ // CHECK: %[[RET:.+]] = icmp eq ptr %y.1, null
35+ // CHECK: ret i1 %[[RET]]
36+ y. len ( ) == 0
37+ }
38+
39+ // CHECK-LABEL: @slice_zst_iter_len_eq_zero_ref
40+ #[ no_mangle]
41+ pub fn slice_zst_iter_len_eq_zero_ref ( y : & mut std:: slice:: Iter < ' _ , MyZST > ) -> bool {
42+ // CHECK: %[[LEN:.+]] = load ptr
43+ // CHECK-NOT: !nonnull
44+ // CHECK: %[[RET:.+]] = icmp eq ptr %[[LEN]], null
1145 // CHECK: ret i1 %[[RET]]
1246 y. len ( ) == 0
1347}
0 commit comments