Skip to content

Commit

Permalink
Replace store of freeze in allocop and in emit new struct with memset…
Browse files Browse the repository at this point in the history
… since aggregate stores are bad
  • Loading branch information
gbaraldi committed Sep 25, 2024
1 parent 6e5e87b commit 2cce1bd
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 11 deletions.
6 changes: 3 additions & 3 deletions src/cgutils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4199,7 +4199,7 @@ static jl_cgval_t emit_new_struct(jl_codectx_t &ctx, jl_value_t *ty, size_t narg
else {
strct = UndefValue::get(lt);
if (nargs < nf)
strct = ctx.builder.CreateFreeze(strct);
strct = ctx.builder.CreateFreeze(strct); // Change this to zero initialize instead?
}
}
else if (tracked.second) {
Expand Down Expand Up @@ -4393,9 +4393,9 @@ static jl_cgval_t emit_new_struct(jl_codectx_t &ctx, jl_value_t *ty, size_t narg
if (promotion_point)
ctx.builder.SetInsertPoint(promotion_point);
if (strct) {
promotion_point = cast<FreezeInst>(ctx.builder.CreateFreeze(UndefValue::get(lt)));
jl_aliasinfo_t ai = jl_aliasinfo_t::fromTBAA(ctx, ctx.tbaa().tbaa_stack);
ai.decorateInst(ctx.builder.CreateStore(promotion_point, strct));
ai.decorateInst(ctx.builder.CreateMemSet(strct, ConstantInt::get(getInt8Ty(ctx.builder.getContext()), 0),
jl_datatype_size(ty), MaybeAlign(jl_datatype_align(ty))));
}
ctx.builder.restoreIP(savedIP);
}
Expand Down
11 changes: 3 additions & 8 deletions src/llvm-alloc-opt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -622,14 +622,9 @@ void Optimizer::initializeAlloca(IRBuilder<> &prolog_builder, AllocaInst *buff,
return;
assert(!buff->isArrayAllocation());
Type *T = buff->getAllocatedType();
Value *Init = UndefValue::get(T);
if ((allockind & AllocFnKind::Zeroed) != AllocFnKind::Unknown)
Init = Constant::getNullValue(T); // zero, as described
else if (allockind == AllocFnKind::Unknown)
Init = Constant::getNullValue(T); // assume zeroed since we didn't find the attribute
else
Init = prolog_builder.CreateFreeze(UndefValue::get(T)); // assume freeze, since LLVM does not natively support this case
prolog_builder.CreateStore(Init, buff);
const DataLayout &DL = F.getParent()->getDataLayout();
prolog_builder.CreateMemSet(buff, ConstantInt::get(Type::getInt8Ty(prolog_builder.getContext()), 0), DL.getTypeAllocSize(T), buff->getAlign());

}

// This function should not erase any safepoint so that the lifetime marker can find and cache
Expand Down

0 comments on commit 2cce1bd

Please sign in to comment.