From 20c9dc96d98011eb5e3119db86dceabddae6c23f Mon Sep 17 00:00:00 2001 From: Prem Chintalapudi Date: Mon, 1 May 2023 13:33:21 -0400 Subject: [PATCH 1/3] Initialize hoisted object allocations --- src/llvm-julia-licm.cpp | 16 +++++++++++++++- test/llvmpasses/julia-licm.ll | 8 ++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/llvm-julia-licm.cpp b/src/llvm-julia-licm.cpp index 84d5d614a7293..4f87d5228cd74 100644 --- a/src/llvm-julia-licm.cpp +++ b/src/llvm-julia-licm.cpp @@ -134,7 +134,6 @@ struct JuliaLICMPassLegacy : public LoopPass { getLoopAnalysisUsage(AU); } }; - struct JuliaLICM : public JuliaPassContext { function_ref GetDT; function_ref GetLI; @@ -339,6 +338,17 @@ struct JuliaLICM : public JuliaPassContext { }); ++HoistedAllocation; moveInstructionBefore(*call, *preheader->getTerminator(), MSSAU, SE); + IRBuilder<> builder(preheader->getTerminator()); + auto obj_i8 = builder.CreateBitCast(call, Type::getInt8PtrTy(call->getContext(), call->getType()->getPointerAddressSpace())); + // Note that this alignment is assuming the GC allocates 16-byte aligned memory + auto clear_obj = builder.CreateMemSet(obj_i8, ConstantInt::get(Type::getInt8Ty(call->getContext()), 0), call->getArgOperand(1), Align(16)); + 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; } } @@ -395,6 +405,10 @@ PreservedAnalyses JuliaLICMPass::run(Loop &L, LoopAnalysisManager &AM, }; auto juliaLICM = JuliaLICM(GetDT, GetLI, GetMSSA, GetSE); if (juliaLICM.runOnLoop(&L, ORE)) { +#ifdef JL_DEBUG_BUILD + if (AR.MSSA) + AR.MSSA->verifyMemorySSA(); +#endif auto preserved = getLoopPassPreservedAnalyses(); preserved.preserveSet(); preserved.preserve(); diff --git a/test/llvmpasses/julia-licm.ll b/test/llvmpasses/julia-licm.ll index dbef009204586..74846cb191c9f 100644 --- a/test/llvmpasses/julia-licm.ll +++ b/test/llvmpasses/julia-licm.ll @@ -29,13 +29,15 @@ L4: ; preds = %top %current_task112 = getelementptr inbounds {}**, {}*** %1, i64 -12 %current_task1 = bitcast {}*** %current_task112 to {}** ; CHECK: %3 = call noalias nonnull {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task1, i64 8, {} addrspace(10)* @tag) + ; CHECK-NEXT: %4 = bitcast {} addrspace(10)* %3 to i8 addrspace(10)* + ; CHECK-NEXT: call void @llvm.memset.p10i8.i64(i8 addrspace(10)* align 16 %4, i8 0, i64 8, i1 false) ; CHECK-NEXT: br label %L22 br label %L22 L22: ; preds = %L4, %L22 %value_phi5 = phi i64 [ 1, %L4 ], [ %5, %L22 ] - ; CHECK: %value_phi5 = phi i64 [ 1, %L4 ], [ %5, %L22 ] - ; CHECK-NEXT %4 = bitcast {} addrspace(10)* %3 to i64 addrspace(10)* + ; CHECK: %value_phi5 = phi i64 [ 1, %L4 ], [ %6, %L22 ] + ; CHECK-NEXT %5 = bitcast {} addrspace(10)* %3 to i64 addrspace(10)* %3 = call noalias nonnull {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task1, i64 8, {} addrspace(10)* @tag) #1 %4 = bitcast {} addrspace(10)* %3 to i64 addrspace(10)* store i64 %value_phi5, i64 addrspace(10)* %4, align 8, !tbaa !2 @@ -55,6 +57,8 @@ top: ; CHECK: preheader: preheader: ; CHECK-NEXT: %alloc = call noalias nonnull {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task, i64 8, {} addrspace(10)* @tag) +; CHECK-NEXT: [[casted:%.*]] = bitcast {} addrspace(10)* %alloc to i8 addrspace(10)* +; CHECK-NEXT: call void @llvm.memset.p10i8.i64(i8 addrspace(10)* align {{[0-9]+}} [[casted]], i8 0, i64 8, i1 false) ; CHECK-NEXT: br label %loop br label %loop loop: From 29bf020ed5cf75768079df8184f9db8f5c4063d3 Mon Sep 17 00:00:00 2001 From: Prem Chintalapudi Date: Mon, 1 May 2023 16:54:53 -0400 Subject: [PATCH 2/3] Address review suggestions --- src/llvm-julia-licm.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/llvm-julia-licm.cpp b/src/llvm-julia-licm.cpp index 4f87d5228cd74..7bc8d91b525f3 100644 --- a/src/llvm-julia-licm.cpp +++ b/src/llvm-julia-licm.cpp @@ -339,9 +339,11 @@ struct JuliaLICM : public JuliaPassContext { ++HoistedAllocation; moveInstructionBefore(*call, *preheader->getTerminator(), MSSAU, SE); 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 16-byte aligned memory - auto clear_obj = builder.CreateMemSet(obj_i8, ConstantInt::get(Type::getInt8Ty(call->getContext()), 0), call->getArgOperand(1), Align(16)); + // 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!"); From 03476ac75f860c2714db12c8f06fbceb5a0c1797 Mon Sep 17 00:00:00 2001 From: Prem Chintalapudi Date: Mon, 1 May 2023 23:12:50 -0400 Subject: [PATCH 3/3] Fix alignment in licm test --- test/llvmpasses/julia-licm.ll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/llvmpasses/julia-licm.ll b/test/llvmpasses/julia-licm.ll index 74846cb191c9f..6fc6f85de7c26 100644 --- a/test/llvmpasses/julia-licm.ll +++ b/test/llvmpasses/julia-licm.ll @@ -30,7 +30,7 @@ L4: ; preds = %top %current_task1 = bitcast {}*** %current_task112 to {}** ; CHECK: %3 = call noalias nonnull {} addrspace(10)* @julia.gc_alloc_obj({}** nonnull %current_task1, i64 8, {} addrspace(10)* @tag) ; CHECK-NEXT: %4 = bitcast {} addrspace(10)* %3 to i8 addrspace(10)* - ; CHECK-NEXT: call void @llvm.memset.p10i8.i64(i8 addrspace(10)* align 16 %4, i8 0, i64 8, i1 false) + ; CHECK-NEXT: call void @llvm.memset.p10i8.i64(i8 addrspace(10)* align {{[0-9]+}} %4, i8 0, i64 8, i1 false) ; CHECK-NEXT: br label %L22 br label %L22