Skip to content

Commit a7427aa

Browse files
authored
codegen,tbaa: fix array isassigned tbaa information (#32356)
This avoids a regression (correctness and performance) caused by #21262 where we were no longer able to fold away the isnull assertion in the case where the source also contains an explicit isassigned check. Also upgrade many other CreateInBoundsGEP calls to include the element type (NFC).
1 parent 7bd700f commit a7427aa

File tree

2 files changed

+29
-18
lines changed

2 files changed

+29
-18
lines changed

src/ccall.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1676,10 +1676,10 @@ static jl_cgval_t emit_ccall(jl_codectx_t &ctx, jl_value_t **args, size_t nargs)
16761676
}
16771677
else if (!jl_has_free_typevars(ety)) {
16781678
Value *idx = emit_unbox(ctx, T_size, idxv, (jl_value_t*)jl_ulong_type);
1679-
Value *arrayptr = emit_bitcast(ctx, emit_arrayptr(ctx, aryv, aryex), T_ppjlvalue);
1680-
Value *slot_addr = ctx.builder.CreateGEP(arrayptr, idx);
1681-
Value *load = tbaa_decorate(tbaa_arraybuf, ctx.builder.CreateLoad(slot_addr));
1682-
Value *res = ctx.builder.CreateZExt(ctx.builder.CreateICmpNE(load, V_null), T_int32);
1679+
Value *arrayptr = emit_bitcast(ctx, emit_arrayptr(ctx, aryv, aryex), T_pprjlvalue);
1680+
Value *slot_addr = ctx.builder.CreateInBoundsGEP(T_prjlvalue, arrayptr, idx);
1681+
Value *load = tbaa_decorate(tbaa_ptrarraybuf, ctx.builder.CreateLoad(T_prjlvalue, slot_addr));
1682+
Value *res = ctx.builder.CreateZExt(ctx.builder.CreateICmpNE(load, Constant::getNullValue(T_prjlvalue)), T_int32);
16831683
JL_GC_POP();
16841684
return mark_or_box_ccall_result(ctx, res, retboxed, rt, unionall, static_rt);
16851685
}

src/cgutils.cpp

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -787,13 +787,18 @@ static unsigned get_box_tindex(jl_datatype_t *jt, jl_value_t *ut)
787787

788788
static Value *emit_nthptr_addr(jl_codectx_t &ctx, Value *v, ssize_t n, bool gctracked = true)
789789
{
790-
return ctx.builder.CreateInBoundsGEP(emit_bitcast(ctx, maybe_decay_tracked(v), T_pprjlvalue),
791-
ConstantInt::get(T_size, n));
790+
return ctx.builder.CreateInBoundsGEP(
791+
T_prjlvalue,
792+
emit_bitcast(ctx, maybe_decay_tracked(v), T_pprjlvalue),
793+
ConstantInt::get(T_size, n));
792794
}
793795

794796
static Value *emit_nthptr_addr(jl_codectx_t &ctx, Value *v, Value *idx)
795797
{
796-
return ctx.builder.CreateInBoundsGEP(emit_bitcast(ctx, maybe_decay_tracked(v), T_pprjlvalue), idx);
798+
return ctx.builder.CreateInBoundsGEP(
799+
T_prjlvalue,
800+
emit_bitcast(ctx, maybe_decay_tracked(v), T_pprjlvalue),
801+
idx);
797802
}
798803

799804
static Value *emit_nthptr(jl_codectx_t &ctx, Value *v, ssize_t n, MDNode *tbaa)
@@ -1485,8 +1490,10 @@ static bool emit_getfield_unknownidx(jl_codectx_t &ctx,
14851490
minimum_align = std::min(minimum_align,
14861491
(size_t)julia_alignment(ft));
14871492
}
1488-
Value *fldptr = ctx.builder.CreateInBoundsGEP(maybe_decay_tracked(
1489-
emit_bitcast(ctx, data_pointer(ctx, strct), T_pprjlvalue)), idx);
1493+
Value *fldptr = ctx.builder.CreateInBoundsGEP(
1494+
T_prjlvalue,
1495+
maybe_decay_tracked(emit_bitcast(ctx, data_pointer(ctx, strct), T_pprjlvalue)),
1496+
idx);
14901497
Value *fld = tbaa_decorate(strct.tbaa,
14911498
maybe_mark_load_dereferenceable(
14921499
ctx.builder.CreateLoad(T_prjlvalue, fldptr),
@@ -1568,8 +1575,9 @@ static jl_cgval_t emit_getfield_knownidx(jl_codectx_t &ctx, const jl_cgval_t &st
15681575
// can pessimize mem2reg
15691576
if (byte_offset > 0) {
15701577
addr = ctx.builder.CreateInBoundsGEP(
1571-
emit_bitcast(ctx, staddr, T_pint8),
1572-
ConstantInt::get(T_size, byte_offset));
1578+
T_int8,
1579+
emit_bitcast(ctx, staddr, T_pint8),
1580+
ConstantInt::get(T_size, byte_offset));
15731581
}
15741582
else {
15751583
addr = staddr;
@@ -1924,8 +1932,8 @@ static Value *emit_array_nd_index(
19241932
ctx.builder.SetInsertPoint(failBB);
19251933
// CreateAlloca is OK here since we are on an error branch
19261934
Value *tmp = ctx.builder.CreateAlloca(T_size, ConstantInt::get(T_size, nidxs));
1927-
for(size_t k=0; k < nidxs; k++) {
1928-
ctx.builder.CreateStore(idxs[k], ctx.builder.CreateInBoundsGEP(tmp, ConstantInt::get(T_size, k)));
1935+
for (size_t k = 0; k < nidxs; k++) {
1936+
ctx.builder.CreateStore(idxs[k], ctx.builder.CreateInBoundsGEP(T_size, tmp, ConstantInt::get(T_size, k)));
19291937
}
19301938
ctx.builder.CreateCall(prepare_call(jlboundserrorv_func),
19311939
{ mark_callee_rooted(a), tmp, ConstantInt::get(T_size, nidxs) });
@@ -2438,8 +2446,9 @@ static void emit_setfield(jl_codectx_t &ctx,
24382446
Value *addr = data_pointer(ctx, strct);
24392447
if (byte_offset > 0) {
24402448
addr = ctx.builder.CreateInBoundsGEP(
2441-
emit_bitcast(ctx, maybe_decay_tracked(addr), T_pint8),
2442-
ConstantInt::get(T_size, byte_offset)); // TODO: use emit_struct_gep
2449+
T_int8,
2450+
emit_bitcast(ctx, maybe_decay_tracked(addr), T_pint8),
2451+
ConstantInt::get(T_size, byte_offset)); // TODO: use emit_struct_gep
24432452
}
24442453
jl_value_t *jfty = jl_svecref(sty->types, idx0);
24452454
if (jl_field_isptr(sty, idx0)) {
@@ -2561,7 +2570,9 @@ static jl_cgval_t emit_new_struct(jl_codectx_t &ctx, jl_value_t *ty, size_t narg
25612570
if (!jl_field_isptr(sty, i) && jl_is_uniontype(jl_field_type(sty, i))) {
25622571
tbaa_decorate(tbaa_unionselbyte, ctx.builder.CreateStore(
25632572
ConstantInt::get(T_int8, 0),
2564-
ctx.builder.CreateInBoundsGEP(emit_bitcast(ctx, strct, T_pint8),
2573+
ctx.builder.CreateInBoundsGEP(
2574+
T_int8,
2575+
emit_bitcast(ctx, strct, T_pint8),
25652576
ConstantInt::get(T_size, jl_field_offset(sty, i) + jl_field_size(sty, i) - 1))));
25662577
}
25672578
}
@@ -2581,15 +2592,15 @@ static jl_cgval_t emit_new_struct(jl_codectx_t &ctx, jl_value_t *ty, size_t narg
25812592
tbaa_decorate(strctinfo.tbaa, ctx.builder.CreateStore(
25822593
ConstantPointerNull::get(cast<PointerType>(T_prjlvalue)),
25832594
ctx.builder.CreateInBoundsGEP(T_prjlvalue, emit_bitcast(ctx, strct, T_pprjlvalue),
2584-
ConstantInt::get(T_size, jl_field_offset(sty, i) / sizeof(void*)))));
2595+
ConstantInt::get(T_size, jl_field_offset(sty, i) / sizeof(void*)))));
25852596
}
25862597
}
25872598
for (size_t i = nargs; i < nf; i++) {
25882599
if (!jl_field_isptr(sty, i) && jl_is_uniontype(jl_field_type(sty, i))) {
25892600
tbaa_decorate(tbaa_unionselbyte, ctx.builder.CreateStore(
25902601
ConstantInt::get(T_int8, 0),
25912602
ctx.builder.CreateInBoundsGEP(emit_bitcast(ctx, strct, T_pint8),
2592-
ConstantInt::get(T_size, jl_field_offset(sty, i) + jl_field_size(sty, i) - 1))));
2603+
ConstantInt::get(T_size, jl_field_offset(sty, i) + jl_field_size(sty, i) - 1))));
25932604
}
25942605
}
25952606
bool need_wb = false;

0 commit comments

Comments
 (0)