about summary refs log tree commit diff
path: root/tests/codegen
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2025-03-25 02:09:15 +0000
committerbors <bors@rust-lang.org>2025-03-25 02:09:15 +0000
commite61403aa4cfbce34b34d78efb52b300a76ac5a62 (patch)
tree00c842650ecbefb713decfd25d5612a4f747c6c0 /tests/codegen
parent1df5affacad5583b98e13b6f1617b8c781f57aa1 (diff)
parent8e7d8ddffe802180b504e0ecaaa40b10b28b291e (diff)
downloadrust-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.rs21
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] }
+}