Skip to content

Commit

Permalink
Fix for JuliaLang#8042: Instead of loading value and casting, cast po…
Browse files Browse the repository at this point in the history
…inter and load.
  • Loading branch information
Arch D. Robison committed Aug 18, 2014
1 parent e9eea55 commit 6c808ea
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 8 deletions.
12 changes: 8 additions & 4 deletions src/cgutils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -876,6 +876,12 @@ static Value *emit_nthptr(Value *v, Value *idx, MDNode *tbaa)
return tbaa_decorate(tbaa,builder.CreateLoad(vptr, false));
}

static Value *emit_nthptr_recast(Value *v, size_t n, MDNode *tbaa, Type* ptype) {
// p = (jl_value_t**)v; *(ptype)&p[n]
Value *vptr = emit_nthptr_addr(v, n);
return tbaa_decorate(tbaa,builder.CreateLoad(builder.CreateBitCast(vptr,ptype), false));
}

static Value *typed_load(Value *ptr, Value *idx_0based, jl_value_t *jltype,
jl_codectx_t *ctx)
{
Expand Down Expand Up @@ -1013,8 +1019,7 @@ static Value *emit_tuplelen(Value *t,jl_value_t *jt)
return builder.CreateLShr(builder.CreatePtrToInt(lenbits, T_int64),
ConstantInt::get(T_int32, 52));
#else
Value *lenbits = emit_nthptr(t, 1, tbaa_tuplelen);
return builder.CreatePtrToInt(lenbits, T_size);
return emit_nthptr_recast(t, 1, tbaa_tuplelen, T_psize);
#endif
}
else { //unboxed
Expand Down Expand Up @@ -1279,8 +1284,7 @@ static Value *emit_arraylen_prim(Value *t, jl_value_t *ty)
{
#ifdef STORE_ARRAY_LEN
(void)ty;
Value *lenbits = emit_nthptr(t, 2, tbaa_arraylen);
return builder.CreatePtrToInt(lenbits, T_size);
return emit_nthptr_recast(t, 2, tbaa_arraylen, T_psize);
#else
jl_value_t *p1 = jl_tparam1(ty);
if (jl_is_long(p1)) {
Expand Down
8 changes: 4 additions & 4 deletions src/codegen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ static Type *jl_value_llvmt;
static Type *jl_pvalue_llvmt;
static Type *jl_ppvalue_llvmt;
static FunctionType *jl_func_sig;
static Type *jl_fptr_llvmt;
static Type *jl_pfptr_llvmt;
static Type *T_int1;
static Type *T_int8;
static Type *T_pint8;
Expand Down Expand Up @@ -1758,7 +1758,7 @@ static Value *emit_known_call(jl_value_t *ff, jl_value_t **args, size_t nargs,
else if (f->fptr == &jl_f_apply && nargs==2 && ctx->vaStack &&
symbol_eq(args[2], ctx->vaName)) {
Value *theF = emit_expr(args[1],ctx);
Value *theFptr = builder.CreateBitCast(emit_nthptr(theF,1, tbaa_func),jl_fptr_llvmt);
Value *theFptr = emit_nthptr_recast(theF,1, tbaa_func,jl_pfptr_llvmt);
Value *nva = emit_n_varargs(ctx);
#ifdef _P64
nva = builder.CreateTrunc(nva, T_int32);
Expand Down Expand Up @@ -2247,7 +2247,7 @@ static Value *emit_call(jl_value_t **args, size_t arglen, jl_codectx_t *ctx,
}
// extract pieces of the function object
// TODO: try extractvalue instead
theFptr = builder.CreateBitCast(emit_nthptr(theFunc, 1, tbaa_func), jl_fptr_llvmt);
theFptr = emit_nthptr_recast(theFunc, 1, tbaa_func, jl_pfptr_llvmt);
theF = theFunc;
}
else {
Expand Down Expand Up @@ -4082,7 +4082,7 @@ static void init_julia_llvm_env(Module *m)
ftargs.push_back(T_int32);
jl_func_sig = FunctionType::get(jl_pvalue_llvmt, ftargs, false);
assert(jl_func_sig != NULL);
jl_fptr_llvmt = PointerType::get(jl_func_sig, 0);
jl_pfptr_llvmt = PointerType::get(PointerType::get(jl_func_sig, 0), 0);

#ifdef JL_GC_MARKSWEEP
jlpgcstack_var =
Expand Down

0 comments on commit 6c808ea

Please sign in to comment.