diff options
| author | bors <bors@rust-lang.org> | 2024-01-07 09:13:32 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-01-07 09:13:32 +0000 |
| commit | 9522993b033e57579dcdee960d8792932aba791f (patch) | |
| tree | 9bc78dc8590b28e606e37b6d1bd717ce821499e8 /tests/codegen | |
| parent | 6f4af9cbfc5ec176359c85446d1259a988299ea0 (diff) | |
| parent | 93b34a5ffa753d6cdaca8aab349408e945412ebd (diff) | |
| download | rust-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.rs | 46 |
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() +} |
