about summary refs log tree commit diff
path: root/tests/codegen
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2024-01-07 09:13:32 +0000
committerbors <bors@rust-lang.org>2024-01-07 09:13:32 +0000
commit9522993b033e57579dcdee960d8792932aba791f (patch)
tree9bc78dc8590b28e606e37b6d1bd717ce821499e8 /tests/codegen
parent6f4af9cbfc5ec176359c85446d1259a988299ea0 (diff)
parent93b34a5ffa753d6cdaca8aab349408e945412ebd (diff)
downloadrust-9522993b033e57579dcdee960d8792932aba791f.tar.gz
rust-9522993b033e57579dcdee960d8792932aba791f.zip
Auto merge of #114205 - the8472:vec-iter-nonnull, r=scottmcm
mark vec::IntoIter pointers as `!nonnull`

This applies the same NonNull optimizations to `vec::IntoIter` as  #113344 did for `slice::Iter`

[Godbolt](https://rust.godbolt.org/z/n1cTea718) showing the test IR on current nightly, note the absence of `!nonnull` on the loads.

r? `@scottmcm`
Diffstat (limited to 'tests/codegen')
-rw-r--r--tests/codegen/vec-iter.rs46
1 files changed, 46 insertions, 0 deletions
diff --git a/tests/codegen/vec-iter.rs b/tests/codegen/vec-iter.rs
new file mode 100644
index 00000000000..0282791e9d1
--- /dev/null
+++ b/tests/codegen/vec-iter.rs
@@ -0,0 +1,46 @@
+// ignore-debug: the debug assertions get in the way
+// compile-flags: -O
+#![crate_type = "lib"]
+#![feature(exact_size_is_empty)]
+
+use std::vec;
+
+// CHECK-LABEL: @vec_iter_len_nonnull
+#[no_mangle]
+pub fn vec_iter_len_nonnull(it: &vec::IntoIter<u8>) -> usize {
+    // CHECK: load ptr
+    // CHECK-SAME: !nonnull
+    // CHECK-SAME: !noundef
+    // CHECK: load ptr
+    // CHECK-SAME: !nonnull
+    // CHECK-SAME: !noundef
+    // CHECK: sub nuw
+    // CHECK: ret
+    it.len()
+}
+
+// CHECK-LABEL: @vec_iter_is_empty_nonnull
+#[no_mangle]
+pub fn vec_iter_is_empty_nonnull(it: &vec::IntoIter<u8>) -> bool {
+    // CHECK: load ptr
+    // CHECK-SAME: !nonnull
+    // CHECK-SAME: !noundef
+    // CHECK: load ptr
+    // CHECK-SAME: !nonnull
+    // CHECK-SAME: !noundef
+    // CHECK: ret
+    it.is_empty()
+}
+
+// CHECK-LABEL: @vec_iter_next
+#[no_mangle]
+pub fn vec_iter_next(it: &mut vec::IntoIter<u8>) -> Option<u8> {
+    // CHECK: load ptr
+    // CHECK-SAME: !nonnull
+    // CHECK-SAME: !noundef
+    // CHECK: load ptr
+    // CHECK-SAME: !nonnull
+    // CHECK-SAME: !noundef
+    // CHECK: ret
+    it.next()
+}