Skip to content

Commit 27f7810

Browse files
committed
Revert "codegen: remove readonly from abstract type calling convention (#58356)"
This reverts commit 9a727c6.
1 parent 237f0f1 commit 27f7810

File tree

4 files changed

+21
-29
lines changed

4 files changed

+21
-29
lines changed

src/cgutils.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1264,7 +1264,6 @@ static Value *emit_sizeof(jl_codectx_t &ctx, const jl_cgval_t &p)
12641264
return dyn_size;
12651265
}
12661266
}
1267-
*/
12681267
12691268
static Value *emit_datatype_mutabl(jl_codectx_t &ctx, Value *dt)
12701269
{
@@ -1279,6 +1278,7 @@ static Value *emit_datatype_mutabl(jl_codectx_t &ctx, Value *dt)
12791278
mutabl = ctx.builder.CreateLShr(mutabl, 1);
12801279
return ctx.builder.CreateTrunc(mutabl, getInt1Ty(ctx.builder.getContext()));
12811280
}
1281+
*/
12821282

12831283
static Value *emit_datatype_isprimitivetype(jl_codectx_t &ctx, Value *typ)
12841284
{

src/codegen.cpp

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1344,7 +1344,7 @@ static MDNode *best_tbaa(jl_tbaacache_t &tbaa_cache, jl_value_t *jt) {
13441344
// note that this includes jl_isbits, although codegen should work regardless
13451345
static bool jl_is_concrete_immutable(jl_value_t* t)
13461346
{
1347-
return jl_may_be_immutable_datatype(t) && ((jl_datatype_t*)t)->isconcretetype;
1347+
return jl_is_immutable_datatype(t) && ((jl_datatype_t*)t)->isconcretetype;
13481348
}
13491349

13501350
static bool jl_is_pointerfree(jl_value_t* t)
@@ -6248,9 +6248,9 @@ static Function* gen_cfun_wrapper(
62486248
inputarg = mark_julia_type(ctx, val, false, jargty);
62496249
}
62506250
}
6251-
else if (static_at || (!jl_is_typevar(jargty) && (!jl_is_datatype(jargty) || jl_is_abstracttype(jargty) || jl_is_mutable_datatype(jargty)))) {
6252-
// must be a jl_value_t* (because it is mutable or abstract)
6253-
inputarg = mark_julia_type(ctx, maybe_decay_untracked(ctx, val), true, jargty_proper);
6251+
else if (static_at || (!jl_is_typevar(jargty) && !jl_is_immutable_datatype(jargty))) {
6252+
// must be a jl_value_t* (because it's mutable or contains gc roots)
6253+
inputarg = mark_julia_type(ctx, maybe_decay_untracked(ctx, emit_bitcast(ctx, val, ctx.types().T_prjlvalue)), true, jargty_proper);
62546254
}
62556255
else {
62566256
// allocate val into a new box, if it might not be boxed
@@ -6263,36 +6263,32 @@ static Function* gen_cfun_wrapper(
62636263
ctx.builder.CreateConstInBoundsGEP1_32(ctx.types().T_prjlvalue, nestPtr, jl_array_len(*closure_types)),
62646264
Align(sizeof(void*)));
62656265
BasicBlock *boxedBB = BasicBlock::Create(ctx.builder.getContext(), "isboxed", cw);
6266-
BasicBlock *notanyBB = BasicBlock::Create(ctx.builder.getContext(), "not-any", cw);
6266+
BasicBlock *loadBB = BasicBlock::Create(ctx.builder.getContext(), "need-load", cw);
62676267
BasicBlock *unboxedBB = BasicBlock::Create(ctx.builder.getContext(), "maybe-unboxed", cw);
62686268
BasicBlock *isanyBB = BasicBlock::Create(ctx.builder.getContext(), "any", cw);
62696269
BasicBlock *afterBB = BasicBlock::Create(ctx.builder.getContext(), "after", cw);
6270+
Value *isrtboxed = ctx.builder.CreateIsNull(val); // XXX: this is the wrong condition and should be inspecting runtime_dt intead
6271+
ctx.builder.CreateCondBr(isrtboxed, boxedBB, loadBB);
6272+
ctx.builder.SetInsertPoint(boxedBB);
6273+
Value *p1 = ctx.builder.CreateBitCast(val, ctx.types().T_pjlvalue);
6274+
p1 = track_pjlvalue(ctx, p1);
6275+
ctx.builder.CreateBr(afterBB);
6276+
ctx.builder.SetInsertPoint(loadBB);
62706277
Value *isrtany = ctx.builder.CreateICmpEQ(
6271-
track_pjlvalue(ctx,literal_pointer_val(ctx, (jl_value_t*)jl_any_type)), runtime_dt);
6272-
ctx.builder.CreateCondBr(isrtany, isanyBB, notanyBB);
6278+
literal_pointer_val(ctx, (jl_value_t*)jl_any_type),
6279+
ctx.builder.CreateBitCast(val, ctx.types().T_pjlvalue));
6280+
ctx.builder.CreateCondBr(isrtany, isanyBB, unboxedBB);
62736281
ctx.builder.SetInsertPoint(isanyBB);
6274-
Value *p1 = ctx.builder.CreateAlignedLoad(ctx.types().T_prjlvalue, val, Align(sizeof(void*)));
6275-
ctx.builder.CreateBr(afterBB);
6276-
isanyBB = ctx.builder.GetInsertBlock(); // could have changed
6277-
ctx.builder.SetInsertPoint(notanyBB);
6278-
jl_cgval_t runtime_dt_val = mark_julia_type(ctx, runtime_dt, true, jl_any_type);
6279-
Value *isrtboxed = // (!jl_is_datatype(runtime_dt) || !jl_is_concrete_datatype(runtime_dt) || jl_is_mutable_datatype(runtime_dt))
6280-
emit_guarded_test(ctx, emit_exactly_isa(ctx, runtime_dt_val, jl_datatype_type), true, [&] {
6281-
return ctx.builder.CreateOr(ctx.builder.CreateNot(emit_isconcrete(ctx, runtime_dt)), emit_datatype_mutabl(ctx, runtime_dt));
6282-
});
6283-
ctx.builder.CreateCondBr(isrtboxed, boxedBB, unboxedBB);
6284-
ctx.builder.SetInsertPoint(boxedBB);
6285-
Value *p2 = track_pjlvalue(ctx, val);
6282+
Value *p2 = ctx.builder.CreateAlignedLoad(ctx.types().T_prjlvalue, ctx.builder.CreateBitCast(val, ctx.types().T_pprjlvalue), Align(sizeof(void*)));
62866283
ctx.builder.CreateBr(afterBB);
6287-
boxedBB = ctx.builder.GetInsertBlock(); // could have changed
62886284
ctx.builder.SetInsertPoint(unboxedBB);
62896285
Value *p3 = emit_new_bits(ctx, runtime_dt, val);
62906286
unboxedBB = ctx.builder.GetInsertBlock(); // could have changed
62916287
ctx.builder.CreateBr(afterBB);
62926288
ctx.builder.SetInsertPoint(afterBB);
62936289
PHINode *p = ctx.builder.CreatePHI(ctx.types().T_prjlvalue, 3);
6294-
p->addIncoming(p1, isanyBB);
6295-
p->addIncoming(p2, boxedBB);
6290+
p->addIncoming(p1, boxedBB);
6291+
p->addIncoming(p2, isanyBB);
62966292
p->addIncoming(p3, unboxedBB);
62976293
inputarg = mark_julia_type(ctx, p, true, jargty_proper);
62986294
}
@@ -7073,7 +7069,7 @@ static jl_returninfo_t get_specsig_function(jl_codectx_t &ctx, Module *M, Value
70737069
param.addAttribute(Attribute::ReadOnly);
70747070
ty = PointerType::get(ty, AddressSpace::Derived);
70757071
}
7076-
else if (isboxed && jl_may_be_immutable_datatype(jt) && !jl_is_abstracttype(jt)) {
7072+
else if (isboxed && jl_is_immutable_datatype(jt)) {
70777073
param.addAttribute(Attribute::ReadOnly);
70787074
}
70797075
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
@@ -1316,7 +1316,7 @@ static inline int jl_is_layout_opaque(const jl_datatype_layout_t *l) JL_NOTSAFEP
13161316
#define jl_is_mutable(t) (((jl_datatype_t*)t)->name->mutabl)
13171317
#define jl_is_mutable_datatype(t) (jl_is_datatype(t) && (((jl_datatype_t*)t)->name->mutabl))
13181318
#define jl_is_immutable(t) (!((jl_datatype_t*)t)->name->mutabl)
1319-
#define jl_may_be_immutable_datatype(t) (jl_is_datatype(t) && (!((jl_datatype_t*)t)->name->mutabl))
1319+
#define jl_is_immutable_datatype(t) (jl_is_datatype(t) && (!((jl_datatype_t*)t)->name->mutabl))
13201320
#define jl_is_uniontype(v) jl_typetagis(v,jl_uniontype_tag<<4)
13211321
#define jl_is_typevar(v) jl_typetagis(v,jl_tvar_tag<<4)
13221322
#define jl_is_unionall(v) jl_typetagis(v,jl_unionall_tag<<4)

test/compiler/codegen.jl

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -879,7 +879,3 @@ struct Vec56937 x::NTuple{8, VecElement{Int}} end
879879

880880
x56937 = Ref(Vec56937(ntuple(_->VecElement(1),8)))
881881
@test x56937[].x[1] == VecElement{Int}(1) # shouldn't crash
882-
883-
@noinline f_mutateany(@nospecialize x) = x[] = 1
884-
g_mutateany() = (y = Ref(0); f_mutateany(y); y[])
885-
@test g_mutateany() === 1

0 commit comments

Comments
 (0)