10
10
// needed as the code changed to read it as a `NonNull`, and thus gets the
11
11
// appropriate `!nonnull` annotations naturally.
12
12
13
+ // Well, now that the end is stored without provenance, the end pointer gets a
14
+ // `!range` annotation instead of a `!nonnull` one.
15
+
13
16
// CHECK-LABEL: @slice_iter_next(
14
17
#[ no_mangle]
15
18
pub fn slice_iter_next < ' a > ( it : & mut std:: slice:: Iter < ' a , u32 > ) -> Option < & ' a u32 > {
16
- // CHECK: %[[ENDP:.+]] = getelementptr inbounds i8, ptr %it, {{i32 4|i64 8}}
17
- // CHECK: %[[END:.+]] = load ptr, ptr %[[ENDP]]
18
- // CHECK-SAME: !nonnull
19
- // CHECK-SAME: !noundef
20
19
// CHECK: %[[START:.+]] = load ptr, ptr %it,
21
20
// CHECK-SAME: !nonnull
22
21
// CHECK-SAME: !noundef
23
- // CHECK: icmp eq ptr %[[START]], %[[END]]
22
+ // CHECK: %[[START_ADDR:.+]] = ptrtoint ptr %[[START]] to [[USIZE:i32|i64]]
23
+ // CHECK: %[[ENDP:.+]] = getelementptr inbounds i8, ptr %it, {{i32 4|i64 8}}
24
+ // CHECK: %[[END_ADDR:.+]] = load [[USIZE]], ptr %[[ENDP]]
25
+ // CHECK-SAME: !range ![[NONZERO_META:[0-9]+]]
26
+ // CHECK-SAME: !noundef
27
+ // CHECK: icmp eq [[USIZE]] %[[END_ADDR]], %[[START_ADDR]]
24
28
25
- // CHECK: store ptr{{.+}}, ptr %it,
29
+ // CHECK: store ptr {{.+}}, ptr %it,
26
30
27
31
it. next ( )
28
32
}
29
33
30
34
// CHECK-LABEL: @slice_iter_next_back(
31
35
#[ no_mangle]
32
36
pub fn slice_iter_next_back < ' a > ( it : & mut std:: slice:: Iter < ' a , u32 > ) -> Option < & ' a u32 > {
33
- // CHECK: %[[ENDP:.+]] = getelementptr inbounds i8, ptr %it, {{i32 4|i64 8}}
34
- // CHECK: %[[END:.+]] = load ptr, ptr %[[ENDP]]
35
- // CHECK-SAME: !nonnull
36
- // CHECK-SAME: !noundef
37
37
// CHECK: %[[START:.+]] = load ptr, ptr %it,
38
38
// CHECK-SAME: !nonnull
39
39
// CHECK-SAME: !noundef
40
- // CHECK: icmp eq ptr %[[START]], %[[END]]
40
+ // CHECK: %[[START_ADDR:.+]] = ptrtoint ptr %[[START]] to [[USIZE]]
41
+ // CHECK: %[[ENDP:.+]] = getelementptr inbounds i8, ptr %it, {{i32 4|i64 8}}
42
+ // CHECK: %[[END_ADDR:.+]] = load [[USIZE]], ptr %[[ENDP]]
43
+ // CHECK-SAME: !range ![[NONZERO_META]]
44
+ // CHECK-SAME: !noundef
45
+ // CHECK: icmp eq [[USIZE]] %[[END_ADDR]], %[[START_ADDR]]
41
46
42
- // CHECK: store ptr {{.+}}, ptr %[[ENDP]],
47
+ // CHECK: store [[USIZE]] {{.+}}, ptr %[[ENDP]],
43
48
44
49
it. next_back ( )
45
50
}
@@ -54,11 +59,12 @@ pub fn slice_iter_next_back<'a>(it: &mut std::slice::Iter<'a, u32>) -> Option<&'
54
59
#[ no_mangle]
55
60
pub fn slice_iter_new ( slice : & [ u32 ] ) -> std:: slice:: Iter < ' _ , u32 > {
56
61
// CHECK-NOT: slice
57
- // CHECK: %[[END:.+]] = getelementptr inbounds i32{{.+}} %slice.0{{.+}} %slice.1
62
+ // CHECK: %[[END_PTR:.+]] = getelementptr inbounds i32{{.+}} %slice.0{{.+}} %slice.1
63
+ // CHECK: %[[END_ADDR:.+]] = ptrtoint ptr %[[END_PTR]] to [[USIZE]]
58
64
// CHECK-NOT: slice
59
65
// CHECK: insertvalue {{.+}} ptr %slice.0, 0
60
66
// CHECK-NOT: slice
61
- // CHECK: insertvalue {{.+}} ptr %[[END ]], 1
67
+ // CHECK: insertvalue {{.+}} [[USIZE]] %[[END_ADDR ]], 1
62
68
// CHECK-NOT: slice
63
69
// CHECK: }
64
70
slice. iter ( )
@@ -69,11 +75,12 @@ pub fn slice_iter_new(slice: &[u32]) -> std::slice::Iter<'_, u32> {
69
75
#[ no_mangle]
70
76
pub fn slice_iter_mut_new ( slice : & mut [ u32 ] ) -> std:: slice:: IterMut < ' _ , u32 > {
71
77
// CHECK-NOT: slice
72
- // CHECK: %[[END:.+]] = getelementptr inbounds i32{{.+}} %slice.0{{.+}} %slice.1
78
+ // CHECK: %[[END_PTR:.+]] = getelementptr inbounds i32{{.+}} %slice.0{{.+}} %slice.1
79
+ // CHECK: %[[END_ADDR:.+]] = ptrtoint ptr %[[END_PTR]] to [[USIZE]]
73
80
// CHECK-NOT: slice
74
81
// CHECK: insertvalue {{.+}} ptr %slice.0, 0
75
82
// CHECK-NOT: slice
76
- // CHECK: insertvalue {{.+}} ptr %[[END ]], 1
83
+ // CHECK: insertvalue {{.+}} [[USIZE]] %[[END_ADDR ]], 1
77
84
// CHECK-NOT: slice
78
85
// CHECK: }
79
86
slice. iter_mut ( )
@@ -82,33 +89,36 @@ pub fn slice_iter_mut_new(slice: &mut [u32]) -> std::slice::IterMut<'_, u32> {
82
89
// CHECK-LABEL: @slice_iter_is_empty
83
90
#[ no_mangle]
84
91
pub fn slice_iter_is_empty ( it : & std:: slice:: Iter < ' _ , u32 > ) -> bool {
85
- // CHECK: %[[ENDP:.+]] = getelementptr inbounds i8, ptr %it, {{i32 4|i64 8}}
86
- // CHECK: %[[END:.+]] = load ptr, ptr %[[ENDP]]
87
- // CHECK-SAME: !nonnull
88
- // CHECK-SAME: !noundef
89
92
// CHECK: %[[START:.+]] = load ptr, ptr %it,
90
93
// CHECK-SAME: !nonnull
91
94
// CHECK-SAME: !noundef
95
+ // CHECK: %[[START_ADDR:.+]] = ptrtoint ptr %[[START]] to [[USIZE]]
96
+ // CHECK: %[[ENDP:.+]] = getelementptr inbounds i8, ptr %it, {{i32 4|i64 8}}
97
+ // CHECK: %[[END_ADDR:.+]] = load [[USIZE]], ptr %[[ENDP]]
98
+ // CHECK-SAME: !range ![[NONZERO_META:[0-9]+]]
99
+ // CHECK-SAME: !noundef
92
100
93
- // CHECK: %[[RET:.+]] = icmp eq ptr %[[START ]], %[[END ]]
101
+ // CHECK: %[[RET:.+]] = icmp eq i64 %[[END_ADDR ]], %[[START_ADDR ]]
94
102
// CHECK: ret i1 %[[RET]]
95
103
it. is_empty ( )
96
104
}
97
105
98
106
// CHECK-LABEL: @slice_iter_len
99
107
#[ no_mangle]
100
108
pub fn slice_iter_len ( it : & std:: slice:: Iter < ' _ , u32 > ) -> usize {
101
- // CHECK: %[[ENDP:.+]] = getelementptr inbounds i8, ptr %it, {{i32 4|i64 8}}
102
- // CHECK: %[[END:.+]] = load ptr, ptr %[[ENDP]]
103
- // CHECK-SAME: !nonnull
104
- // CHECK-SAME: !noundef
105
109
// CHECK: %[[START:.+]] = load ptr, ptr %it,
106
110
// CHECK-SAME: !nonnull
107
111
// CHECK-SAME: !noundef
112
+ // CHECK: %[[START_ADDR:.+]] = ptrtoint ptr %[[START]] to [[USIZE]]
113
+ // CHECK: %[[ENDP:.+]] = getelementptr inbounds i8, ptr %it, {{i32 4|i64 8}}
114
+ // CHECK: %[[END_ADDR:.+]] = load [[USIZE]], ptr %[[ENDP]]
115
+ // CHECK-SAME: !range ![[NONZERO_META:[0-9]+]]
116
+ // CHECK-SAME: !noundef
108
117
109
- // CHECK: ptrtoint
110
- // CHECK: ptrtoint
111
- // CHECK: sub nuw
112
- // CHECK: lshr exact
118
+ // CHECK: %[[BYTE_DIFF:.+]] = sub nuw [[USIZE]] %[[END_ADDR]], %[[START_ADDR]]
119
+ // CHECK: %[[ELEM_DIFF:.+]] = lshr exact [[USIZE]] %[[BYTE_DIFF]], 2
120
+ // CHECK: ret [[USIZE]] %[[ELEM_DIFF]]
113
121
it. len ( )
114
122
}
123
+
124
+ // CHECK: ![[NONZERO_META]] = !{[[USIZE]] 1, [[USIZE]] 0}
0 commit comments