Closed
Description
The following code
pub fn box_uninitialized2() -> Box<MaybeUninit<[usize; 1024*1024]>> { unsafe {
// CHECK-LABEL: @box_uninitialized2
// CHECK-NOT: store
// CHECK-NOT: alloca
// CHECK-NOT: memcpy
// CHECK-NOT: memset
Box::new(std::mem::uninitialized())
} }
generates some really awful LLVM IR:
start:
%_1.sroa.0 = alloca [1048576 x i64], align 8
%_1.sroa.0.0.sroa_cast3 = bitcast [1048576 x i64]* %_1.sroa.0 to i8*
call void @llvm.lifetime.start.p0i8(i64 8388608, i8* nonnull %_1.sroa.0.0.sroa_cast3)
%0 = tail call i8* @__rust_alloc(i64 8388608, i64 8) #3, !noalias !1
%1 = icmp eq i8* %0, null
br i1 %1, label %bb7.i.i, label %"_ZN35_$LT$alloc..boxed..Box$LT$T$GT$$GT$3new17h9460275a68e769e0E.exit"
bb7.i.i: ; preds = %start
; call alloc::alloc::handle_alloc_error
tail call void @_ZN5alloc5alloc18handle_alloc_error17h3b023122fefb532cE(i64 8388608, i64 8) #3, !noalias !1
unreachable
"_ZN35_$LT$alloc..boxed..Box$LT$T$GT$$GT$3new17h9460275a68e769e0E.exit": ; preds = %start
%2 = bitcast i8* %0 to %"core::mem::MaybeUninit<[usize; 1048576]>"*
call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 8 %0, i8* nonnull align 8 %_1.sroa.0.0.sroa_cast3, i64 8388608, i1 false)
call void @llvm.lifetime.end.p0i8(i64 8388608, i8* nonnull %_1.sroa.0.0.sroa_cast3)
ret %"core::mem::MaybeUninit<[usize; 1048576]>"* %2
The same happens with std::mem::MaybeUninit::uninitialized()
.
Cc @arielb1, who made me write these tests, and @rust-lang/wg-codegen