1
1
//@ compile-flags: -Copt-level=3
2
+ //@ needs-deterministic-layouts (opposite scalar pair orders breaks it)
2
3
#![ crate_type = "lib" ]
3
4
4
5
type Demo = [ u8 ; 3 ] ;
@@ -7,7 +8,40 @@ type Demo = [u8; 3];
7
8
#[ no_mangle]
8
9
pub fn slice_iter_len_eq_zero ( y : std:: slice:: Iter < ' _ , Demo > ) -> bool {
9
10
// 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
11
45
// CHECK: ret i1 %[[RET]]
12
46
y. len ( ) == 0
13
47
}
0 commit comments