diff options
| author | bors <bors@rust-lang.org> | 2025-03-25 02:09:15 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2025-03-25 02:09:15 +0000 |
| commit | e61403aa4cfbce34b34d78efb52b300a76ac5a62 (patch) | |
| tree | 00c842650ecbefb713decfd25d5612a4f747c6c0 /tests/codegen | |
| parent | 1df5affacad5583b98e13b6f1617b8c781f57aa1 (diff) | |
| parent | 8e7d8ddffe802180b504e0ecaaa40b10b28b291e (diff) | |
| download | rust-e61403aa4cfbce34b34d78efb52b300a76ac5a62.tar.gz rust-e61403aa4cfbce34b34d78efb52b300a76ac5a62.zip | |
Auto merge of #138634 - saethlin:repeated-uninit, r=scottmcm,oli-obk
Lower to a memset(undef) when Rvalue::Repeat repeats uninit Fixes https://github.com/rust-lang/rust/issues/138625. It is technically correct to just do nothing. But if we actually do nothing, we may miss that this is de-initializing something, so instead we just lower to a single memset that writes undef. This is still superior to the memcpy loop, in both quality of code we hand to the backend and LLVM's final output.
Diffstat (limited to 'tests/codegen')
| -rw-r--r-- | tests/codegen/uninit-repeat-in-aggregate.rs | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/tests/codegen/uninit-repeat-in-aggregate.rs b/tests/codegen/uninit-repeat-in-aggregate.rs new file mode 100644 index 00000000000..0fa2eb7d56c --- /dev/null +++ b/tests/codegen/uninit-repeat-in-aggregate.rs @@ -0,0 +1,21 @@ +//@ compile-flags: -Copt-level=3 + +#![crate_type = "lib"] + +use std::mem::MaybeUninit; + +// We need to make sure len is at offset 0, otherwise codegen needs an extra instruction +#[repr(C)] +pub struct SmallVec<T> { + pub len: u64, + pub arr: [MaybeUninit<T>; 24], +} + +// CHECK-LABEL: @uninit_arr_via_const +#[no_mangle] +pub fn uninit_arr_via_const() -> SmallVec<String> { + // CHECK-NEXT: start: + // CHECK-NEXT: store i64 0, + // CHECK-NEXT: ret + SmallVec { len: 0, arr: [const { MaybeUninit::uninit() }; 24] } +} |
