From 8b99a77012b18bbdda6c507a3779df2327ed4952 Mon Sep 17 00:00:00 2001 From: pchintalapudi <34727397+pchintalapudi@users.noreply.github.com> Date: Thu, 4 May 2023 21:43:33 +0000 Subject: [PATCH] Initialize hoisted object allocations (#49584) (cherry picked from commit 5032a1af20ad3b5bf9928eb5f9a1486b580402bc) --- src/llvm-julia-licm.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/llvm-julia-licm.cpp b/src/llvm-julia-licm.cpp index 87a804c8f4995a..8562ffb690c4ff 100644 --- a/src/llvm-julia-licm.cpp +++ b/src/llvm-julia-licm.cpp @@ -291,6 +291,20 @@ struct JuliaLICM : public JuliaPassContext { } changed = true; } + IRBuilder<> builder(preheader->getTerminator()); + builder.SetCurrentDebugLocation(call->getDebugLoc()); + auto obj_i8 = builder.CreateBitCast(call, Type::getInt8PtrTy(call->getContext(), call->getType()->getPointerAddressSpace())); + // Note that this alignment is assuming the GC allocates at least pointer-aligned memory + auto align = Align(DL.getPointerSize(0)); + auto clear_obj = builder.CreateMemSet(obj_i8, ConstantInt::get(Type::getInt8Ty(call->getContext()), 0), call->getArgOperand(1), align); + if (MSSAU.getMemorySSA()) { + auto alloc_mdef = MSSAU.getMemorySSA()->getMemoryAccess(call); + assert(isa(alloc_mdef) && "Expected alloc to be associated with a memory def!"); + auto clear_mdef = MSSAU.createMemoryAccessAfter(clear_obj, nullptr, alloc_mdef); + assert(isa(clear_mdef) && "Expected memset to be associated with a memory def!"); + (void) clear_mdef; + } + changed = true; } } }