Skip to content

Commit 03791b5

Browse files
vtjnashKristofferC
authored andcommitted
codegen: remove readonly from abstract type calling convention (#58356)
Refs: #58070 (cherry picked from commit f07565f)
1 parent ed5f35d commit 03791b5

File tree

4 files changed

+28
-19
lines changed

4 files changed

+28
-19
lines changed

Compiler/test/codegen.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,3 +1032,7 @@ end
10321032
const x57872 = "Hello"
10331033
f57872() = (Core.isdefinedglobal(@__MODULE__, Base.compilerbarrier(:const, :x57872)), x57872) # Extra globalref here to force world age bounds
10341034
@test f57872() == (true, "Hello")
1035+
1036+
@noinline f_mutateany(@nospecialize x) = x[] = 1
1037+
g_mutateany() = (y = Ref(0); f_mutateany(y); y[])
1038+
@test g_mutateany() === 1

src/cgutils.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1479,6 +1479,7 @@ static Value *emit_sizeof(jl_codectx_t &ctx, const jl_cgval_t &p)
14791479
return dyn_size;
14801480
}
14811481
}
1482+
*/
14821483

14831484
static Value *emit_datatype_mutabl(jl_codectx_t &ctx, Value *dt)
14841485
{
@@ -1493,7 +1494,6 @@ static Value *emit_datatype_mutabl(jl_codectx_t &ctx, Value *dt)
14931494
mutabl = ctx.builder.CreateLShr(mutabl, 1);
14941495
return ctx.builder.CreateTrunc(mutabl, getInt1Ty(ctx.builder.getContext()));
14951496
}
1496-
*/
14971497

14981498
static Value *emit_datatype_isprimitivetype(jl_codectx_t &ctx, Value *typ)
14991499
{

src/codegen.cpp

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1657,7 +1657,7 @@ static MDNode *best_tbaa(jl_tbaacache_t &tbaa_cache, jl_value_t *jt) {
16571657
// note that this includes jl_isbits, although codegen should work regardless
16581658
static bool jl_is_concrete_immutable(jl_value_t* t)
16591659
{
1660-
return jl_is_immutable_datatype(t) && ((jl_datatype_t*)t)->isconcretetype;
1660+
return jl_may_be_immutable_datatype(t) && ((jl_datatype_t*)t)->isconcretetype;
16611661
}
16621662

16631663
static bool jl_is_pointerfree(jl_value_t* t)
@@ -7355,8 +7355,8 @@ static Function *gen_cfun_wrapper(
73557355
inputarg = mark_julia_type(ctx, val, false, jargty);
73567356
}
73577357
}
7358-
else if (static_at || (!jl_is_typevar(jargty) && !jl_is_immutable_datatype(jargty))) {
7359-
// must be a jl_value_t* (because it's mutable or contains gc roots)
7358+
else if (static_at || (!jl_is_typevar(jargty) && (!jl_is_datatype(jargty) || jl_is_abstracttype(jargty) || jl_is_mutable_datatype(jargty)))) {
7359+
// must be a jl_value_t* (because it is mutable or abstract)
73607360
inputarg = mark_julia_type(ctx, maybe_decay_untracked(ctx, val), true, jargty_proper);
73617361
}
73627362
else {
@@ -7370,31 +7370,36 @@ static Function *gen_cfun_wrapper(
73707370
emit_ptrgep(ctx, nestPtr, jl_array_nrows(*closure_types) * ctx.types().sizeof_ptr),
73717371
Align(sizeof(void*)));
73727372
BasicBlock *boxedBB = BasicBlock::Create(ctx.builder.getContext(), "isboxed", cw);
7373-
BasicBlock *loadBB = BasicBlock::Create(ctx.builder.getContext(), "need-load", cw);
7373+
BasicBlock *notanyBB = BasicBlock::Create(ctx.builder.getContext(), "not-any", cw);
73747374
BasicBlock *unboxedBB = BasicBlock::Create(ctx.builder.getContext(), "maybe-unboxed", cw);
73757375
BasicBlock *isanyBB = BasicBlock::Create(ctx.builder.getContext(), "any", cw);
73767376
BasicBlock *afterBB = BasicBlock::Create(ctx.builder.getContext(), "after", cw);
7377-
Value *isrtboxed = ctx.builder.CreateIsNull(val); // XXX: this is the wrong condition and should be inspecting runtime_dt instead
7378-
ctx.builder.CreateCondBr(isrtboxed, boxedBB, loadBB);
7379-
ctx.builder.SetInsertPoint(boxedBB);
7380-
Value *p1 = val;
7381-
p1 = track_pjlvalue(ctx, p1);
7382-
ctx.builder.CreateBr(afterBB);
7383-
ctx.builder.SetInsertPoint(loadBB);
73847377
Value *isrtany = ctx.builder.CreateICmpEQ(
7385-
literal_pointer_val(ctx, (jl_value_t*)jl_any_type), val);
7386-
ctx.builder.CreateCondBr(isrtany, isanyBB, unboxedBB);
7378+
track_pjlvalue(ctx,literal_pointer_val(ctx, (jl_value_t*)jl_any_type)), runtime_dt);
7379+
ctx.builder.CreateCondBr(isrtany, isanyBB, notanyBB);
73877380
ctx.builder.SetInsertPoint(isanyBB);
7388-
Value *p2 = ctx.builder.CreateAlignedLoad(ctx.types().T_prjlvalue, val, Align(sizeof(void*)));
7381+
Value *p1 = ctx.builder.CreateAlignedLoad(ctx.types().T_prjlvalue, val, Align(sizeof(void*)));
7382+
ctx.builder.CreateBr(afterBB);
7383+
isanyBB = ctx.builder.GetInsertBlock(); // could have changed
7384+
ctx.builder.SetInsertPoint(notanyBB);
7385+
jl_cgval_t runtime_dt_val = mark_julia_type(ctx, runtime_dt, true, jl_any_type);
7386+
Value *isrtboxed = // (!jl_is_datatype(runtime_dt) || !jl_is_concrete_datatype(runtime_dt) || jl_is_mutable_datatype(runtime_dt))
7387+
emit_guarded_test(ctx, emit_exactly_isa(ctx, runtime_dt_val, jl_datatype_type), true, [&] {
7388+
return ctx.builder.CreateOr(ctx.builder.CreateNot(emit_isconcrete(ctx, runtime_dt)), emit_datatype_mutabl(ctx, runtime_dt));
7389+
});
7390+
ctx.builder.CreateCondBr(isrtboxed, boxedBB, unboxedBB);
7391+
ctx.builder.SetInsertPoint(boxedBB);
7392+
Value *p2 = track_pjlvalue(ctx, val);
73897393
ctx.builder.CreateBr(afterBB);
7394+
boxedBB = ctx.builder.GetInsertBlock(); // could have changed
73907395
ctx.builder.SetInsertPoint(unboxedBB);
73917396
Value *p3 = emit_new_bits(ctx, runtime_dt, val);
73927397
unboxedBB = ctx.builder.GetInsertBlock(); // could have changed
73937398
ctx.builder.CreateBr(afterBB);
73947399
ctx.builder.SetInsertPoint(afterBB);
73957400
PHINode *p = ctx.builder.CreatePHI(ctx.types().T_prjlvalue, 3);
7396-
p->addIncoming(p1, boxedBB);
7397-
p->addIncoming(p2, isanyBB);
7401+
p->addIncoming(p1, isanyBB);
7402+
p->addIncoming(p2, boxedBB);
73987403
p->addIncoming(p3, unboxedBB);
73997404
inputarg = mark_julia_type(ctx, p, true, jargty_proper);
74007405
}
@@ -7939,7 +7944,7 @@ static jl_returninfo_t get_specsig_function(jl_codegen_params_t &params, Module
79397944
param.addAttribute(Attribute::ReadOnly);
79407945
ty = PointerType::get(M->getContext(), AddressSpace::Derived);
79417946
}
7942-
else if (isboxed && jl_is_immutable_datatype(jt)) {
7947+
else if (isboxed && jl_may_be_immutable_datatype(jt) && !jl_is_abstracttype(jt)) {
79437948
param.addAttribute(Attribute::ReadOnly);
79447949
}
79457950
else if (jl_is_primitivetype(jt) && ty->isIntegerTy()) {

src/julia.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1631,7 +1631,7 @@ static inline int jl_field_isconst(jl_datatype_t *st, int i) JL_NOTSAFEPOINT
16311631
#define jl_is_mutable(t) (((jl_datatype_t*)t)->name->mutabl)
16321632
#define jl_is_mutable_datatype(t) (jl_is_datatype(t) && (((jl_datatype_t*)t)->name->mutabl))
16331633
#define jl_is_immutable(t) (!((jl_datatype_t*)t)->name->mutabl)
1634-
#define jl_is_immutable_datatype(t) (jl_is_datatype(t) && (!((jl_datatype_t*)t)->name->mutabl))
1634+
#define jl_may_be_immutable_datatype(t) (jl_is_datatype(t) && (!((jl_datatype_t*)t)->name->mutabl))
16351635
#define jl_is_uniontype(v) jl_typetagis(v,jl_uniontype_tag<<4)
16361636
#define jl_is_typevar(v) jl_typetagis(v,jl_tvar_tag<<4)
16371637
#define jl_is_unionall(v) jl_typetagis(v,jl_unionall_tag<<4)

0 commit comments

Comments
 (0)