1010// needed as the code changed to read it as a `NonNull`, and thus gets the
1111// appropriate `!nonnull` annotations naturally.
1212
13+ // Well, now that the end is stored without provenance, the end pointer gets a
14+ // `!range` annotation instead of a `!nonnull` one.
15+
1316// CHECK-LABEL: @slice_iter_next(
1417#[ no_mangle]
1518pub 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
2019 // CHECK: %[[START:.+]] = load ptr, ptr %it,
2120 // CHECK-SAME: !nonnull
2221 // 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]]
2428
25- // CHECK: store ptr{{.+}}, ptr %it,
29+ // CHECK: store ptr {{.+}}, ptr %it,
2630
2731 it. next ( )
2832}
2933
3034// CHECK-LABEL: @slice_iter_next_back(
3135#[ no_mangle]
3236pub 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
3737 // CHECK: %[[START:.+]] = load ptr, ptr %it,
3838 // CHECK-SAME: !nonnull
3939 // 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]]
4146
42- // CHECK: store ptr {{.+}}, ptr %[[ENDP]],
47+ // CHECK: store [[USIZE]] {{.+}}, ptr %[[ENDP]],
4348
4449 it. next_back ( )
4550}
@@ -54,11 +59,12 @@ pub fn slice_iter_next_back<'a>(it: &mut std::slice::Iter<'a, u32>) -> Option<&'
5459#[ no_mangle]
5560pub fn slice_iter_new ( slice : & [ u32 ] ) -> std:: slice:: Iter < ' _ , u32 > {
5661 // 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]]
5864 // CHECK-NOT: slice
5965 // CHECK: insertvalue {{.+}} ptr %slice.0, 0
6066 // CHECK-NOT: slice
61- // CHECK: insertvalue {{.+}} ptr %[[END ]], 1
67+ // CHECK: insertvalue {{.+}} [[USIZE]] %[[END_ADDR ]], 1
6268 // CHECK-NOT: slice
6369 // CHECK: }
6470 slice. iter ( )
@@ -69,11 +75,12 @@ pub fn slice_iter_new(slice: &[u32]) -> std::slice::Iter<'_, u32> {
6975#[ no_mangle]
7076pub fn slice_iter_mut_new ( slice : & mut [ u32 ] ) -> std:: slice:: IterMut < ' _ , u32 > {
7177 // 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]]
7380 // CHECK-NOT: slice
7481 // CHECK: insertvalue {{.+}} ptr %slice.0, 0
7582 // CHECK-NOT: slice
76- // CHECK: insertvalue {{.+}} ptr %[[END ]], 1
83+ // CHECK: insertvalue {{.+}} [[USIZE]] %[[END_ADDR ]], 1
7784 // CHECK-NOT: slice
7885 // CHECK: }
7986 slice. iter_mut ( )
@@ -82,33 +89,36 @@ pub fn slice_iter_mut_new(slice: &mut [u32]) -> std::slice::IterMut<'_, u32> {
8289// CHECK-LABEL: @slice_iter_is_empty
8390#[ no_mangle]
8491pub 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
8992 // CHECK: %[[START:.+]] = load ptr, ptr %it,
9093 // CHECK-SAME: !nonnull
9194 // 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
92100
93- // CHECK: %[[RET:.+]] = icmp eq ptr %[[START ]], %[[END ]]
101+ // CHECK: %[[RET:.+]] = icmp eq i64 %[[END_ADDR ]], %[[START_ADDR ]]
94102 // CHECK: ret i1 %[[RET]]
95103 it. is_empty ( )
96104}
97105
98106// CHECK-LABEL: @slice_iter_len
99107#[ no_mangle]
100108pub 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
105109 // CHECK: %[[START:.+]] = load ptr, ptr %it,
106110 // CHECK-SAME: !nonnull
107111 // 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
108117
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]]
113121 it. len ( )
114122}
123+
124+ // CHECK: ![[NONZERO_META]] = !{[[USIZE]] 1, [[USIZE]] 0}
0 commit comments