authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-04-26 13:04:56-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-04-28 13:24:42-07:00
log51adbf472bcf9eacc0099e39778a6f9177fea023
tree6371f7a0419042c3721bfcbfc1e594fdaafdcad6
parent00b690540e561391d17c65e45f818db6be8fecec

llvm backend: fix memset with byref element value


1 files changed, 19 insertions(+), 4 deletions(-)

src/codegen/llvm.zig+19-4
......@@ -8429,6 +8429,7 @@ pub const FuncGen = struct {
84298429 const dest_ptr_align = ptr_ty.ptrAlignment(target);
84308430 const u8_llvm_ty = self.context.intType(8);
84318431 const dest_ptr = self.sliceOrArrayPtr(dest_slice, ptr_ty);
8432 const is_volatile = ptr_ty.isVolatilePtr();
84328433
84338434 if (val_is_undef) {
84348435 // Even if safety is disabled, we still emit a memset to undefined since it conveys
......@@ -8439,7 +8440,7 @@ pub const FuncGen = struct {
84398440 else
84408441 u8_llvm_ty.getUndef();
84418442 const len = self.sliceOrArrayLenInBytes(dest_slice, ptr_ty);
8442 _ = self.builder.buildMemSet(dest_ptr, fill_byte, len, dest_ptr_align, ptr_ty.isVolatilePtr());
8443 _ = self.builder.buildMemSet(dest_ptr, fill_byte, len, dest_ptr_align, is_volatile);
84438444
84448445 if (safety and self.dg.module.comp.bin_file.options.valgrind) {
84458446 self.valgrindMarkUndef(dest_ptr, len);
......@@ -8454,7 +8455,7 @@ pub const FuncGen = struct {
84548455 // In this case we can take advantage of LLVM's intrinsic.
84558456 const fill_byte = try self.bitCast(value, elem_ty, Type.u8);
84568457 const len = self.sliceOrArrayLenInBytes(dest_slice, ptr_ty);
8457 _ = self.builder.buildMemSet(dest_ptr, fill_byte, len, dest_ptr_align, ptr_ty.isVolatilePtr());
8458 _ = self.builder.buildMemSet(dest_ptr, fill_byte, len, dest_ptr_align, is_volatile);
84588459 return null;
84598460 }
84608461
......@@ -8496,8 +8497,22 @@ pub const FuncGen = struct {
84968497 _ = self.builder.buildCondBr(end, body_block, end_block);
84978498
84988499 self.builder.positionBuilderAtEnd(body_block);
8499 const store_inst = self.builder.buildStore(value, it_ptr);
8500 store_inst.setAlignment(@min(elem_ty.abiAlignment(target), dest_ptr_align));
8500 const elem_abi_alignment = elem_ty.abiAlignment(target);
8501 const it_ptr_alignment = @min(elem_abi_alignment, dest_ptr_align);
8502 if (isByRef(elem_ty)) {
8503 _ = self.builder.buildMemCpy(
8504 it_ptr,
8505 it_ptr_alignment,
8506 value,
8507 elem_abi_alignment,
8508 llvm_usize_ty.constInt(elem_abi_size, .False),
8509 is_volatile,
8510 );
8511 } else {
8512 const store_inst = self.builder.buildStore(value, it_ptr);
8513 store_inst.setAlignment(it_ptr_alignment);
8514 store_inst.setVolatile(llvm.Bool.fromBool(is_volatile));
8515 }
85018516 const one_gep = [_]*llvm.Value{llvm_usize_ty.constInt(1, .False)};
85028517 const next_ptr = self.builder.buildInBoundsGEP(elem_llvm_ty, it_ptr, &one_gep, one_gep.len, "");
85038518 _ = self.builder.buildBr(loop_block);