diff --git a/deps/llvm.mk b/deps/llvm.mk index efe8bd4100567..6a319647440af 100644 --- a/deps/llvm.mk +++ b/deps/llvm.mk @@ -447,6 +447,18 @@ $(eval $(call LLVM_PATCH,llvm-10.0-PPC-LI-Elimination)) # delete for LLVM 11 $(eval $(call LLVM_PATCH,llvm-julia-tsan-custom-as)) endif # LLVM_VER 10.0 +ifeq ($(LLVM_VER_SHORT),11.0) +$(eval $(call LLVM_PATCH,llvm-D27629-AArch64-large_model_6.0.1)) +$(eval $(call LLVM_PATCH,llvm8-D34078-vectorize-fdiv)) +$(eval $(call LLVM_PATCH,llvm-7.0-D44650)) # mingw32 build fix +$(eval $(call LLVM_PATCH,llvm-6.0-DISABLE_ABI_CHECKS)) +$(eval $(call LLVM_PATCH,llvm9-D50010-VNCoercion-ni)) +$(eval $(call LLVM_PATCH,llvm7-revert-D44485)) +#$(eval $(call LLVM_PATCH,llvm-D75072-SCEV-add-type)) +$(eval $(call LLVM_PATCH,llvm-julia-tsan-custom-as)) +endif # LLVM_VER 11.0 + + # Add a JL prefix to the version map. DO NOT REMOVE ifneq ($(LLVM_VER), svn) $(eval $(call LLVM_PATCH,llvm7-symver-jlprefix)) diff --git a/src/ccall.cpp b/src/ccall.cpp index a139dc4d2acd2..f62ecbe1396ba 100644 --- a/src/ccall.cpp +++ b/src/ccall.cpp @@ -89,7 +89,7 @@ static Value *runtime_sym_lookup( BasicBlock *dlsym_lookup = BasicBlock::Create(jl_LLVMContext, "dlsym"); BasicBlock *ccall_bb = BasicBlock::Create(jl_LLVMContext, "ccall"); Constant *initnul = ConstantPointerNull::get((PointerType*)T_pvoidfunc); - LoadInst *llvmf_orig = irbuilder.CreateAlignedLoad(T_pvoidfunc, llvmgv, sizeof(void*)); + LoadInst *llvmf_orig = irbuilder.CreateAlignedLoad(T_pvoidfunc, llvmgv, Align(sizeof(void*))); // This in principle needs a consume ordering so that load from // this pointer sees a valid value. However, this is not supported by // LLVM (or agreed on in the C/C++ standard FWIW) and should be @@ -116,7 +116,7 @@ static Value *runtime_sym_lookup( } Value *llvmf = irbuilder.CreateCall(prepare_call_in(jl_builderModule(irbuilder), jldlsym_func), { libname, stringConstPtr(emission_context, irbuilder, f_name), libptrgv }); - StoreInst *store = irbuilder.CreateAlignedStore(llvmf, llvmgv, sizeof(void*)); + StoreInst *store = irbuilder.CreateAlignedStore(llvmf, llvmgv, Align(sizeof(void*))); store->setAtomic(AtomicOrdering::Release); irbuilder.CreateBr(ccall_bb); @@ -171,7 +171,7 @@ static GlobalVariable *emit_plt_thunk( IRBuilder<> irbuilder(b0); Value *ptr = runtime_sym_lookup(emission_context, irbuilder, funcptype, f_lib, f_name, plt, libptrgv, llvmgv, runtime_lib); - StoreInst *store = irbuilder.CreateAlignedStore(irbuilder.CreateBitCast(ptr, T_pvoidfunc), got, sizeof(void*)); + StoreInst *store = irbuilder.CreateAlignedStore(irbuilder.CreateBitCast(ptr, T_pvoidfunc), got, Align(sizeof(void*))); store->setAtomic(AtomicOrdering::Release); SmallVector args; for (Function::arg_iterator arg = plt->arg_begin(), arg_e = plt->arg_end(); arg != arg_e; ++arg) @@ -234,7 +234,7 @@ static Value *emit_plt( functype, attrs, cc, f_lib, f_name, libptrgv, llvmgv, runtime_lib); } GlobalVariable *got = prepare_global_in(jl_Module, sharedgot); - LoadInst *got_val = ctx.builder.CreateAlignedLoad(got, sizeof(void*)); + LoadInst *got_val = ctx.builder.CreateAlignedLoad(got, Align(sizeof(void*))); // See comment in `runtime_sym_lookup` above. This in principle needs a // consume ordering too. This is even less likely to cause issues though // since the only thing we do to this loaded pointer is to call it @@ -365,8 +365,8 @@ static Value *llvm_type_rewrite( cast(from)->setAlignment(Align(align)); to = emit_bitcast(ctx, from, target_type->getPointerTo()); } - ctx.builder.CreateAlignedStore(v, from, align); - return ctx.builder.CreateAlignedLoad(to, align); + ctx.builder.CreateAlignedStore(v, from, Align(align)); + return ctx.builder.CreateAlignedLoad(to, Align(align)); } // --- argument passing and scratch space utilities --- @@ -1410,7 +1410,7 @@ static jl_cgval_t emit_ccall(jl_codectx_t &ctx, jl_value_t **args, size_t nargs) Value *ptls_i16 = emit_bitcast(ctx, ctx.ptlsStates, T_pint16); const int tid_offset = offsetof(jl_tls_states_t, tid); Value *ptid = ctx.builder.CreateInBoundsGEP(ptls_i16, ConstantInt::get(T_size, tid_offset / 2)); - LoadInst *tid = ctx.builder.CreateAlignedLoad(ptid, sizeof(int16_t)); + LoadInst *tid = ctx.builder.CreateAlignedLoad(ptid, Align(sizeof(int16_t))); tbaa_decorate(tbaa_const, tid); return mark_or_box_ccall_result(ctx, tid, retboxed, rt, unionall, static_rt); } @@ -1421,7 +1421,7 @@ static jl_cgval_t emit_ccall(jl_codectx_t &ctx, jl_value_t **args, size_t nargs) Value *ptls_pv = emit_bitcast(ctx, ctx.ptlsStates, T_pprjlvalue); const int ct_offset = offsetof(jl_tls_states_t, current_task); Value *pct = ctx.builder.CreateInBoundsGEP(ptls_pv, ConstantInt::get(T_size, ct_offset / sizeof(void*))); - LoadInst *ct = ctx.builder.CreateAlignedLoad(pct, sizeof(void*)); + LoadInst *ct = ctx.builder.CreateAlignedLoad(pct, Align(sizeof(void*))); tbaa_decorate(tbaa_const, ct); return mark_or_box_ccall_result(ctx, ct, retboxed, rt, unionall, static_rt); } @@ -1504,7 +1504,7 @@ static jl_cgval_t emit_ccall(jl_codectx_t &ctx, jl_value_t **args, size_t nargs) idx = ctx.builder.CreateAdd(idx, ConstantInt::get(T_size, ((jl_datatype_t*)ety)->layout->first_ptr)); } Value *slot_addr = ctx.builder.CreateInBoundsGEP(T_prjlvalue, arrayptr, idx); - LoadInst *load = ctx.builder.CreateAlignedLoad(T_prjlvalue, slot_addr, sizeof(void*)); + LoadInst *load = ctx.builder.CreateAlignedLoad(T_prjlvalue, slot_addr, Align(sizeof(void*))); load->setAtomic(AtomicOrdering::Unordered); tbaa_decorate(tbaa_ptrarraybuf, load); Value *res = ctx.builder.CreateZExt(ctx.builder.CreateICmpNE(load, V_rnull), T_int32); @@ -1802,7 +1802,7 @@ jl_cgval_t function_sig_t::emit_a_ccall( // When this happens, cast through memory. auto slot = emit_static_alloca(ctx, resultTy); slot->setAlignment(Align(boxalign)); - ctx.builder.CreateAlignedStore(result, slot, boxalign); + ctx.builder.CreateAlignedStore(result, slot, Align(boxalign)); emit_memcpy(ctx, strct, tbaa, slot, tbaa, rtsz, boxalign, tbaa); } else { diff --git a/src/cgutils.cpp b/src/cgutils.cpp index da4a2a37a6029..4706aba38e290 100644 --- a/src/cgutils.cpp +++ b/src/cgutils.cpp @@ -398,7 +398,7 @@ static Value *literal_pointer_val(jl_codectx_t &ctx, jl_value_t *p) return literal_static_pointer_val(p); Value *pgv = literal_pointer_val_slot(ctx, p); return tbaa_decorate(tbaa_const, maybe_mark_load_dereferenceable( - ctx.builder.CreateAlignedLoad(T_pjlvalue, pgv, sizeof(void*)), + ctx.builder.CreateAlignedLoad(T_pjlvalue, pgv, Align(sizeof(void*))), false, jl_typeof(p))); } @@ -413,7 +413,7 @@ static Value *literal_pointer_val(jl_codectx_t &ctx, jl_binding_t *p) // bindings are prefixed with jl_bnd# Value *pgv = julia_pgv(ctx, "jl_bnd#", p->name, p->owner, p); return tbaa_decorate(tbaa_const, maybe_mark_load_dereferenceable( - ctx.builder.CreateAlignedLoad(T_pjlvalue, pgv, sizeof(void*)), + ctx.builder.CreateAlignedLoad(T_pjlvalue, pgv, Align(sizeof(void*))), false, sizeof(jl_binding_t), alignof(jl_binding_t))); } @@ -453,7 +453,7 @@ static Value *julia_binding_gv(jl_codectx_t &ctx, jl_binding_t *b) if (imaging_mode) bv = emit_bitcast(ctx, tbaa_decorate(tbaa_const, - ctx.builder.CreateAlignedLoad(T_pjlvalue, julia_pgv(ctx, "*", b->name, b->owner, b), sizeof(void*))), + ctx.builder.CreateAlignedLoad(T_pjlvalue, julia_pgv(ctx, "*", b->name, b->owner, b), Align(sizeof(void*)))), T_pprjlvalue); else bv = ConstantExpr::getBitCast(literal_static_pointer_val(b), T_pprjlvalue); @@ -883,7 +883,7 @@ static jl_cgval_t emit_typeof(jl_codectx_t &ctx, const jl_cgval_t &p) auto emit_unboxty = [&] () -> Value* { if (imaging_mode) return track_pjlvalue( - ctx, tbaa_decorate(tbaa_const, ctx.builder.CreateAlignedLoad(T_pjlvalue, datatype_or_p, sizeof(void*)))); + ctx, tbaa_decorate(tbaa_const, ctx.builder.CreateAlignedLoad(T_pjlvalue, datatype_or_p, Align(sizeof(void*))))); return datatype_or_p; }; Value *res; @@ -926,20 +926,20 @@ static Value *emit_datatype_types(jl_codectx_t &ctx, Value *dt) Value *Ptr = emit_bitcast(ctx, decay_derived(ctx, dt), T_ppjlvalue); Value *Idx = ConstantInt::get(T_size, offsetof(jl_datatype_t, types) / sizeof(void*)); return tbaa_decorate(tbaa_const, ctx.builder.CreateAlignedLoad( - T_pjlvalue, ctx.builder.CreateInBoundsGEP(T_pjlvalue, Ptr, Idx), sizeof(void*))); + T_pjlvalue, ctx.builder.CreateInBoundsGEP(T_pjlvalue, Ptr, Idx), Align(sizeof(void*)))); } static Value *emit_datatype_nfields(jl_codectx_t &ctx, Value *dt) { Value *type_svec = emit_bitcast(ctx, emit_datatype_types(ctx, dt), T_psize); - return tbaa_decorate(tbaa_const, ctx.builder.CreateAlignedLoad(T_size, type_svec, sizeof(void*))); + return tbaa_decorate(tbaa_const, ctx.builder.CreateAlignedLoad(T_size, type_svec, Align(sizeof(void*)))); } static Value *emit_datatype_size(jl_codectx_t &ctx, Value *dt) { Value *Ptr = emit_bitcast(ctx, decay_derived(ctx, dt), T_pint32); Value *Idx = ConstantInt::get(T_size, offsetof(jl_datatype_t, size) / sizeof(int)); - return tbaa_decorate(tbaa_const, ctx.builder.CreateAlignedLoad(T_int32, ctx.builder.CreateInBoundsGEP(T_int32, Ptr, Idx), sizeof(int32_t))); + return tbaa_decorate(tbaa_const, ctx.builder.CreateAlignedLoad(T_int32, ctx.builder.CreateInBoundsGEP(T_int32, Ptr, Idx), Align(sizeof(int32_t)))); } /* this is valid code, it's simply unused @@ -997,7 +997,7 @@ static Value *emit_datatype_mutabl(jl_codectx_t &ctx, Value *dt) Value *Ptr = emit_bitcast(ctx, decay_derived(ctx, dt), T_pint8); Value *Idx = ConstantInt::get(T_size, offsetof(jl_datatype_t, mutabl)); Value *mutabl = tbaa_decorate(tbaa_const, - ctx.builder.CreateAlignedLoad(T_int8, ctx.builder.CreateInBoundsGEP(T_int8, Ptr, Idx), 1)); + ctx.builder.CreateAlignedLoad(T_int8, ctx.builder.CreateInBoundsGEP(T_int8, Ptr, Idx), Align(1))); return ctx.builder.CreateTrunc(mutabl, T_int1); } @@ -1008,7 +1008,7 @@ static Value *emit_datatype_abstract(jl_codectx_t &ctx, Value *dt) Value *Idx = ConstantInt::get(T_size, offsetof(jl_datatype_t, abstract)); Value *abstract = tbaa_decorate(tbaa_const, - ctx.builder.CreateAlignedLoad(T_int8, ctx.builder.CreateInBoundsGEP(T_int8, Ptr, Idx), 1)); + ctx.builder.CreateAlignedLoad(T_int8, ctx.builder.CreateInBoundsGEP(T_int8, Ptr, Idx), Align(1))); return ctx.builder.CreateTrunc(abstract, T_int1); } */ @@ -1024,7 +1024,7 @@ static Value *emit_datatype_isprimitivetype(jl_codectx_t &ctx, Value *dt) static Value *emit_datatype_name(jl_codectx_t &ctx, Value *dt) { Value *vptr = emit_nthptr_addr(ctx, dt, (ssize_t)(offsetof(jl_datatype_t, name) / sizeof(char*))); - return tbaa_decorate(tbaa_const, ctx.builder.CreateAlignedLoad(T_prjlvalue, vptr, sizeof(void*))); + return tbaa_decorate(tbaa_const, ctx.builder.CreateAlignedLoad(T_prjlvalue, vptr, Align(sizeof(void*)))); } // --- generating various error checks --- @@ -1217,7 +1217,7 @@ static Value *emit_isconcrete(jl_codectx_t &ctx, Value *typ) { Value *isconcrete; isconcrete = ctx.builder.CreateConstInBoundsGEP1_32(T_int8, emit_bitcast(ctx, decay_derived(ctx, typ), T_pint8), offsetof(jl_datatype_t, isconcretetype)); - isconcrete = tbaa_decorate(tbaa_const, ctx.builder.CreateAlignedLoad(T_int8, isconcrete, 1)); + isconcrete = tbaa_decorate(tbaa_const, ctx.builder.CreateAlignedLoad(T_int8, isconcrete, Align(1))); isconcrete = ctx.builder.CreateTrunc(isconcrete, T_int1); return isconcrete; } @@ -1351,7 +1351,7 @@ static jl_cgval_t typed_load(jl_codectx_t &ctx, Value *ptr, Value *idx_0based, j alignment = sizeof(void*); else if (!alignment) alignment = julia_alignment(jltype); - load = ctx.builder.CreateAlignedLoad(data, alignment, false); + load = ctx.builder.CreateAlignedLoad(data, Align(alignment), false); if (aliasscope) load->setMetadata("alias.scope", aliasscope); if (isboxed) { @@ -1400,7 +1400,7 @@ static void typed_store(jl_codectx_t &ctx, alignment = sizeof(void*); else if (!alignment) alignment = julia_alignment(jltype); - StoreInst *store = ctx.builder.CreateAlignedStore(r, ptr, alignment); + StoreInst *store = ctx.builder.CreateAlignedStore(r, ptr, Align(alignment)); if (isboxed) // TODO: we should do this for anything with CountTrackedPointers(elty).count > 0 store->setOrdering(AtomicOrdering::Unordered); if (aliasscope) @@ -1481,8 +1481,8 @@ static void emit_memcpy_llvm(jl_codectx_t &ctx, Value *dst, MDNode *tbaa_dst, Va src = emit_bitcast(ctx, src, dstty); } if (direct) { - auto val = tbaa_decorate(tbaa_src, ctx.builder.CreateAlignedLoad(src, align, is_volatile)); - tbaa_decorate(tbaa_dst, ctx.builder.CreateAlignedStore(val, dst, align, is_volatile)); + auto val = tbaa_decorate(tbaa_src, ctx.builder.CreateAlignedLoad(src, Align(align), is_volatile)); + tbaa_decorate(tbaa_dst, ctx.builder.CreateAlignedStore(val, dst, Align(align), is_volatile)); return; } } @@ -1622,7 +1622,7 @@ static bool emit_getfield_unknownidx(jl_codectx_t &ctx, T_prjlvalue, maybe_decay_tracked(ctx, emit_bitcast(ctx, data_pointer(ctx, strct), T_pprjlvalue)), idx0()); - LoadInst *fld = ctx.builder.CreateAlignedLoad(T_prjlvalue, fldptr, sizeof(void*)); + LoadInst *fld = ctx.builder.CreateAlignedLoad(T_prjlvalue, fldptr, Align(sizeof(void*))); fld->setOrdering(AtomicOrdering::Unordered); tbaa_decorate(strct.tbaa, fld); maybe_mark_load_dereferenceable(fld, maybe_null, minimum_field_size, minimum_align); @@ -1696,7 +1696,7 @@ static jl_cgval_t emit_getfield_knownidx(jl_codectx_t &ctx, const jl_cgval_t &st addr = ctx.builder.CreateConstInBoundsGEP2_32(lt, staddr, 0, idx); } if (jl_field_isptr(jt, idx)) { - LoadInst *Load = ctx.builder.CreateAlignedLoad(T_prjlvalue, maybe_bitcast(ctx, addr, T_pprjlvalue), sizeof(void*)); + LoadInst *Load = ctx.builder.CreateAlignedLoad(T_prjlvalue, maybe_bitcast(ctx, addr, T_pprjlvalue), Align(sizeof(void*))); Load->setOrdering(AtomicOrdering::Unordered); maybe_mark_load_dereferenceable(Load, maybe_null, jl_field_type(jt, idx)); Value *fldv = tbaa_decorate(strct.tbaa, Load); @@ -1716,7 +1716,7 @@ static jl_cgval_t emit_getfield_knownidx(jl_codectx_t &ctx, const jl_cgval_t &st else { ptindex = emit_struct_gep(ctx, cast(lt), staddr, byte_offset + fsz); } - Instruction *tindex0 = tbaa_decorate(tbaa_unionselbyte, ctx.builder.CreateAlignedLoad(T_int8, ptindex, 1)); + Instruction *tindex0 = tbaa_decorate(tbaa_unionselbyte, ctx.builder.CreateAlignedLoad(T_int8, ptindex, Align(1))); //tindex0->setMetadata(LLVMContext::MD_range, MDNode::get(jl_LLVMContext, { // ConstantAsMetadata::get(ConstantInt::get(T_int8, 0)), // ConstantAsMetadata::get(ConstantInt::get(T_int8, union_max)) })); @@ -1768,7 +1768,7 @@ static jl_cgval_t emit_getfield_knownidx(jl_codectx_t &ctx, const jl_cgval_t &st unsigned fld = st_idx + i; Value *fldv = ctx.builder.CreateExtractValue(obj, makeArrayRef(fld)); Value *fldp = ctx.builder.CreateConstInBoundsGEP1_32(ET, lv, i); - ctx.builder.CreateAlignedStore(fldv, fldp, align); + ctx.builder.CreateAlignedStore(fldv, fldp, Align(align)); } // emit remaining bytes up to tindex if (i < ptindex - st_idx) { @@ -1777,7 +1777,7 @@ static jl_cgval_t emit_getfield_knownidx(jl_codectx_t &ctx, const jl_cgval_t &st for (; i < ptindex - st_idx; i++) { Value *fldv = ctx.builder.CreateExtractValue(obj, makeArrayRef(st_idx + i)); Value *fldp = ctx.builder.CreateConstInBoundsGEP1_32(T_int8, staddr, i); - ctx.builder.CreateAlignedStore(fldv, fldp, 1); + ctx.builder.CreateAlignedStore(fldv, fldp, Align(1)); } } } @@ -1895,7 +1895,7 @@ static Value *emit_arraylen_prim(jl_codectx_t &ctx, const jl_cgval_t &tinfo) emit_bitcast(ctx, decay_derived(ctx, t), jl_parray_llvmt), 1); //index (not offset) of length field in jl_parray_llvmt MDNode *tbaa = arraytype_constshape(ty) ? tbaa_const : tbaa_arraylen; - LoadInst *len = ctx.builder.CreateAlignedLoad(addr, sizeof(size_t)); + LoadInst *len = ctx.builder.CreateAlignedLoad(addr, Align(sizeof(size_t))); len->setOrdering(AtomicOrdering::NotAtomic); MDBuilder MDB(jl_LLVMContext); auto rng = MDB.createRange(V_size0, ConstantInt::get(T_size, arraytype_maxsize(tinfo.typ))); @@ -1945,7 +1945,7 @@ static Value *emit_arrayptr_internal(jl_codectx_t &ctx, const jl_cgval_t &tinfo, PointerType::get(PPT->getElementType(), AS), PT->getAddressSpace())); } - LoadInst *LI = ctx.builder.CreateAlignedLoad(addr, sizeof(char*)); + LoadInst *LI = ctx.builder.CreateAlignedLoad(addr, Align(sizeof(char*))); LI->setOrdering(AtomicOrdering::NotAtomic); LI->setMetadata(LLVMContext::MD_nonnull, MDNode::get(jl_LLVMContext, None)); tbaa_decorate(tbaa, LI); @@ -1987,7 +1987,7 @@ static Value *emit_arrayflags(jl_codectx_t &ctx, const jl_cgval_t &tinfo) jl_array_llvmt, emit_bitcast(ctx, decay_derived(ctx, t), jl_parray_llvmt), arrayflag_field); - return tbaa_decorate(tbaa_arrayflags, ctx.builder.CreateAlignedLoad(T_int16, addr, sizeof(int16_t))); + return tbaa_decorate(tbaa_arrayflags, ctx.builder.CreateAlignedLoad(T_int16, addr, Align(sizeof(int16_t)))); } static Value *emit_arrayndims(jl_codectx_t &ctx, const jl_cgval_t &ary) @@ -2010,7 +2010,7 @@ static Value *emit_arrayelsize(jl_codectx_t &ctx, const jl_cgval_t &tinfo) Value *addr = ctx.builder.CreateStructGEP(jl_array_llvmt, emit_bitcast(ctx, decay_derived(ctx, t), jl_parray_llvmt), elsize_field); - return tbaa_decorate(tbaa_const, ctx.builder.CreateAlignedLoad(T_int16, addr, sizeof(int16_t))); + return tbaa_decorate(tbaa_const, ctx.builder.CreateAlignedLoad(T_int16, addr, Align(sizeof(int16_t)))); } static Value *emit_arrayoffset(jl_codectx_t &ctx, const jl_cgval_t &tinfo, int nd) @@ -2028,7 +2028,7 @@ static Value *emit_arrayoffset(jl_codectx_t &ctx, const jl_cgval_t &tinfo, int n jl_array_llvmt, emit_bitcast(ctx, decay_derived(ctx, t), jl_parray_llvmt), offset_field); - return tbaa_decorate(tbaa_arrayoffset, ctx.builder.CreateAlignedLoad(T_int32, addr, sizeof(int32_t))); + return tbaa_decorate(tbaa_arrayoffset, ctx.builder.CreateAlignedLoad(T_int32, addr, Align(sizeof(int32_t)))); } // Returns the size of the array represented by `tinfo` for the given dimension `dim` if @@ -2119,7 +2119,7 @@ static Value *emit_array_nd_index( // CreateAlloca is OK here since we are on an error branch Value *tmp = ctx.builder.CreateAlloca(T_size, ConstantInt::get(T_size, nidxs)); for (size_t k = 0; k < nidxs; k++) { - ctx.builder.CreateAlignedStore(idxs[k], ctx.builder.CreateInBoundsGEP(T_size, tmp, ConstantInt::get(T_size, k)), sizeof(size_t)); + ctx.builder.CreateAlignedStore(idxs[k], ctx.builder.CreateInBoundsGEP(T_size, tmp, ConstantInt::get(T_size, k)), Align(sizeof(size_t))); } ctx.builder.CreateCall(prepare_call(jlboundserrorv_func), { mark_callee_rooted(ctx, a), tmp, ConstantInt::get(T_size, nidxs) }); @@ -2142,7 +2142,7 @@ static void init_bits_value(jl_codectx_t &ctx, Value *newv, Value *v, MDNode *tb { // newv should already be tagged tbaa_decorate(tbaa, ctx.builder.CreateAlignedStore(v, emit_bitcast(ctx, newv, - PointerType::get(v->getType(), 0)), alignment)); + PointerType::get(v->getType(), 0)), Align(alignment))); } static void init_bits_cgval(jl_codectx_t &ctx, Value *newv, const jl_cgval_t& v, MDNode *tbaa) @@ -2252,7 +2252,7 @@ static Value *load_i8box(jl_codectx_t &ctx, Value *v, jl_datatype_t *ty) Value *idx[] = {ConstantInt::get(T_int32, 0), ctx.builder.CreateZExt(v, T_int32)}; auto slot = ctx.builder.CreateInBoundsGEP(gv, idx); return tbaa_decorate(tbaa_const, maybe_mark_load_dereferenceable( - ctx.builder.CreateAlignedLoad(T_pjlvalue, slot, sizeof(void*)), false, + ctx.builder.CreateAlignedLoad(T_pjlvalue, slot, Align(sizeof(void*))), false, (jl_value_t*)ty)); } @@ -2513,7 +2513,13 @@ static void emit_unionmove(jl_codectx_t &ctx, Value *dest, MDNode *tbaa_dst, con { if (AllocaInst *ai = dyn_cast(dest)) // TODO: make this a lifetime_end & dereferencable annotation? - ctx.builder.CreateAlignedStore(UndefValue::get(ai->getAllocatedType()), ai, ai->getAlignment()); + ctx.builder.CreateAlignedStore(UndefValue::get(ai->getAllocatedType()), ai, +#if JL_LLVM_VERSION >= 100000 + ai->getAlign() +#else + ai->getAlignment() +#endif + ); if (jl_is_concrete_type(src.typ) || src.constant) { jl_value_t *typ = src.constant ? jl_typeof(src.constant) : src.typ; Type *store_ty = julia_type_to_llvm(ctx, typ); @@ -2704,7 +2710,7 @@ static void emit_setfield(jl_codectx_t &ctx, Value *r = boxed(ctx, rhs); // don't need a temporary gcroot since it'll be rooted by strct cast(tbaa_decorate(strct.tbaa, ctx.builder.CreateAlignedStore(r, emit_bitcast(ctx, addr, T_pprjlvalue), - sizeof(jl_value_t*)))) + Align(sizeof(jl_value_t*))))) ->setOrdering(AtomicOrdering::Unordered); if (wb && strct.isboxed && !type_is_permalloc(rhs.typ)) emit_write_barrier(ctx, boxed(ctx, strct), r); @@ -2718,7 +2724,7 @@ static void emit_setfield(jl_codectx_t &ctx, Value *tindex = compute_tindex_unboxed(ctx, rhs_union, jfty); tindex = ctx.builder.CreateNUWSub(tindex, ConstantInt::get(T_int8, 1)); Value *ptindex = ctx.builder.CreateInBoundsGEP(T_int8, emit_bitcast(ctx, maybe_decay_tracked(ctx, addr), T_pint8), ConstantInt::get(T_size, fsz)); - tbaa_decorate(tbaa_unionselbyte, ctx.builder.CreateAlignedStore(tindex, ptindex, 1)); + tbaa_decorate(tbaa_unionselbyte, ctx.builder.CreateAlignedStore(tindex, ptindex, Align(1))); // copy data if (!rhs.isghost) { emit_unionmove(ctx, addr, strct.tbaa, rhs, nullptr); @@ -2800,7 +2806,7 @@ static jl_cgval_t emit_new_struct(jl_codectx_t &ctx, jl_value_t *ty, size_t narg fval = boxed(ctx, fval_info); if (!init_as_value) cast(tbaa_decorate(tbaa_stack, - ctx.builder.CreateAlignedStore(fval, dest, jl_field_align(sty, i)))) + ctx.builder.CreateAlignedStore(fval, dest, Align(jl_field_align(sty, i))))) ->setOrdering(AtomicOrdering::Unordered); } else if (jl_is_uniontype(jtype)) { @@ -2829,7 +2835,7 @@ static jl_cgval_t emit_new_struct(jl_codectx_t &ctx, jl_value_t *ty, size_t narg unsigned i = 0; for (; i < fsz / al; i++) { Value *fldp = ctx.builder.CreateConstInBoundsGEP1_32(ET, lv, i); - Value *fldv = tbaa_decorate(tbaa_stack, ctx.builder.CreateAlignedLoad(ET, fldp, al)); + Value *fldv = tbaa_decorate(tbaa_stack, ctx.builder.CreateAlignedLoad(ET, fldp, Align(al))); strct = ctx.builder.CreateInsertValue(strct, fldv, makeArrayRef(llvm_idx + i)); } // emit remaining bytes up to tindex @@ -2838,7 +2844,7 @@ static jl_cgval_t emit_new_struct(jl_codectx_t &ctx, jl_value_t *ty, size_t narg staddr = ctx.builder.CreateBitCast(staddr, T_pint8); for (; i < ptindex - llvm_idx; i++) { Value *fldp = ctx.builder.CreateConstInBoundsGEP1_32(T_int8, staddr, i); - Value *fldv = tbaa_decorate(tbaa_stack, ctx.builder.CreateAlignedLoad(T_int8, fldp, 1)); + Value *fldv = tbaa_decorate(tbaa_stack, ctx.builder.CreateAlignedLoad(T_int8, fldp, Align(1))); strct = ctx.builder.CreateInsertValue(strct, fldv, makeArrayRef(llvm_idx + i)); } } @@ -2850,7 +2856,7 @@ static jl_cgval_t emit_new_struct(jl_codectx_t &ctx, jl_value_t *ty, size_t narg } else { Value *ptindex = emit_struct_gep(ctx, lt, strct, offs + fsz); - tbaa_decorate(tbaa_unionselbyte, ctx.builder.CreateAlignedStore(tindex, ptindex, 1)); + tbaa_decorate(tbaa_unionselbyte, ctx.builder.CreateAlignedStore(tindex, ptindex, Align(1))); if (!rhs_union.isghost) emit_unionmove(ctx, dest, tbaa_stack, fval_info, nullptr); } @@ -2881,7 +2887,7 @@ static jl_cgval_t emit_new_struct(jl_codectx_t &ctx, jl_value_t *ty, size_t narg tbaa_decorate(tbaa_unionselbyte, ctx.builder.CreateAlignedStore( ConstantInt::get(T_int8, 0), ctx.builder.CreateConstInBoundsGEP2_32(lt, strct, 0, llvm_idx), - 1)); + Align(1))); } } if (type_is_ghost(lt)) @@ -2902,7 +2908,7 @@ static jl_cgval_t emit_new_struct(jl_codectx_t &ctx, jl_value_t *ty, size_t narg ConstantInt::get(T_int8, 0), ctx.builder.CreateInBoundsGEP(T_int8, emit_bitcast(ctx, strct, T_pint8), ConstantInt::get(T_size, jl_field_offset(sty, i) + jl_field_size(sty, i) - 1)), - 1)); + Align(1))); } } // TODO: verify that nargs <= nf (currently handled by front-end) diff --git a/src/codegen.cpp b/src/codegen.cpp index b1e0b5df32f95..363534be404db 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -2278,7 +2278,7 @@ static jl_cgval_t emit_globalref(jl_codectx_t &ctx, jl_module_t *mod, jl_sym_t * if (bnd->constp) { return mark_julia_const(bnd->value); } - LoadInst *v = ctx.builder.CreateAlignedLoad(T_prjlvalue, bp, sizeof(void*)); + LoadInst *v = ctx.builder.CreateAlignedLoad(T_prjlvalue, bp, Align(sizeof(void*))); v->setOrdering(AtomicOrdering::Unordered); tbaa_decorate(tbaa_binding, v); return mark_julia_type(ctx, v, true, (jl_value_t*)jl_any_type); @@ -2459,11 +2459,11 @@ static Value *emit_bits_compare(jl_codectx_t &ctx, jl_cgval_t arg1, jl_cgval_t a fld2 = ctx.builder.CreateExtractValue(varg2, llvm_idx); if (jl_field_isptr(sty, i)) { if (arg1.ispointer()) { - fld1 = ctx.builder.CreateAlignedLoad(T_prjlvalue, fld1, sizeof(void*)); + fld1 = ctx.builder.CreateAlignedLoad(T_prjlvalue, fld1, Align(sizeof(void*))); cast(fld1)->setOrdering(AtomicOrdering::Unordered); } if (arg2.ispointer()) { - fld2 = ctx.builder.CreateAlignedLoad(T_prjlvalue, fld2, sizeof(void*)); + fld2 = ctx.builder.CreateAlignedLoad(T_prjlvalue, fld2, Align(sizeof(void*))); cast(fld2)->setOrdering(AtomicOrdering::Unordered); } subAns = emit_box_compare(ctx, @@ -2476,7 +2476,7 @@ static Value *emit_bits_compare(jl_codectx_t &ctx, jl_cgval_t arg1, jl_cgval_t a jl_cgval_t fld2_info; if (arg1.ispointer()) { Value *tindex1 = ctx.builder.CreateNUWAdd(ConstantInt::get(T_int8, 1), - ctx.builder.CreateAlignedLoad(T_int8, emit_struct_gep(ctx, at, varg1, tindex_offset), 1)); + ctx.builder.CreateAlignedLoad(T_int8, emit_struct_gep(ctx, at, varg1, tindex_offset), Align(1))); fld1_info = mark_julia_slot(fld1, fldty, tindex1, arg1.tbaa); } else { @@ -2484,7 +2484,7 @@ static Value *emit_bits_compare(jl_codectx_t &ctx, jl_cgval_t arg1, jl_cgval_t a } if (arg2.ispointer()) { Value *tindex2 = ctx.builder.CreateNUWAdd(ConstantInt::get(T_int8, 1), - ctx.builder.CreateAlignedLoad(T_int8, emit_struct_gep(ctx, at, varg2, tindex_offset), 1)); + ctx.builder.CreateAlignedLoad(T_int8, emit_struct_gep(ctx, at, varg2, tindex_offset), Align(1))); fld2_info = mark_julia_slot(fld2, fldty, tindex2, arg2.tbaa); } else { @@ -2762,7 +2762,7 @@ static bool emit_builtin_call(jl_codectx_t &ctx, jl_cgval_t *ret, jl_value_t *f, ptindex = emit_bitcast(ctx, ptindex, T_pint8); ptindex = ctx.builder.CreateInBoundsGEP(T_int8, ptindex, offset); ptindex = ctx.builder.CreateInBoundsGEP(T_int8, ptindex, idx); - Instruction *tindex = tbaa_decorate(tbaa_arrayselbyte, ctx.builder.CreateAlignedLoad(T_int8, ptindex, 1)); + Instruction *tindex = tbaa_decorate(tbaa_arrayselbyte, ctx.builder.CreateAlignedLoad(T_int8, ptindex, Align(1))); tindex->setMetadata(LLVMContext::MD_range, MDNode::get(jl_LLVMContext, { ConstantAsMetadata::get(ConstantInt::get(T_int8, 0)), ConstantAsMetadata::get(ConstantInt::get(T_int8, union_max)) })); @@ -2832,7 +2832,7 @@ static bool emit_builtin_call(jl_codectx_t &ctx, jl_cgval_t *ret, jl_value_t *f, ctx.builder.CreateConstInBoundsGEP1_32(T_prjlvalue, emit_bitcast(ctx, decay_derived(ctx, aryv), T_pprjlvalue), jl_array_data_owner_offset(nd) / sizeof(jl_value_t*)), - sizeof(void*)); + Align(sizeof(void*))); tbaa_decorate(tbaa_const, maybe_mark_load_dereferenceable(own_ptr, false, (jl_value_t*)jl_array_any_type)); } else { @@ -2909,7 +2909,7 @@ static bool emit_builtin_call(jl_codectx_t &ctx, jl_cgval_t *ret, jl_value_t *f, jl_value_t *boundscheck = (nargs == 3 ? argv[3].constant : jl_true); idx = emit_bounds_check(ctx, va_ary, NULL, idx, valen, boundscheck); idx = ctx.builder.CreateAdd(idx, ConstantInt::get(T_size, ctx.nReqArgs)); - Instruction *v = ctx.builder.CreateAlignedLoad(T_prjlvalue, ctx.builder.CreateInBoundsGEP(ctx.argArray, idx), sizeof(void*)); + Instruction *v = ctx.builder.CreateAlignedLoad(T_prjlvalue, ctx.builder.CreateInBoundsGEP(ctx.argArray, idx), Align(sizeof(void*))); // if we know the result type of this load, we will mark that information here too tbaa_decorate(tbaa_value, maybe_mark_load_dereferenceable(v, false, rt)); *ret = mark_julia_type(ctx, v, /*boxed*/ true, rt); @@ -3046,7 +3046,7 @@ static bool emit_builtin_call(jl_codectx_t &ctx, jl_cgval_t *ret, jl_value_t *f, jl_value_t *boundscheck = (nargs == 3 ? argv[3].constant : jl_true); emit_bounds_check(ctx, typ, (jl_value_t*)jl_datatype_type, idx, types_len, boundscheck); Value *fieldtyp_p = ctx.builder.CreateInBoundsGEP(T_prjlvalue, decay_derived(ctx, emit_bitcast(ctx, types_svec, T_pprjlvalue)), idx); - Value *fieldtyp = tbaa_decorate(tbaa_const, ctx.builder.CreateAlignedLoad(T_prjlvalue, fieldtyp_p, sizeof(void*))); + Value *fieldtyp = tbaa_decorate(tbaa_const, ctx.builder.CreateAlignedLoad(T_prjlvalue, fieldtyp_p, Align(sizeof(void*)))); *ret = mark_julia_type(ctx, fieldtyp, true, (jl_value_t*)jl_type_type); return true; } @@ -3060,7 +3060,7 @@ static bool emit_builtin_call(jl_codectx_t &ctx, jl_cgval_t *ret, jl_value_t *f, if (sty == jl_string_type || sty == jl_simplevector_type) { // String and SimpleVector's length fields have the same layout auto ptr = emit_bitcast(ctx, boxed(ctx, obj), T_psize); - Value *len = tbaa_decorate(tbaa_mutab, ctx.builder.CreateAlignedLoad(T_size, ptr, sizeof(size_t))); + Value *len = tbaa_decorate(tbaa_mutab, ctx.builder.CreateAlignedLoad(T_size, ptr, Align(sizeof(size_t)))); MDBuilder MDB(jl_LLVMContext); if (sty == jl_simplevector_type) { auto rng = MDB.createRange( @@ -3149,7 +3149,7 @@ static bool emit_builtin_call(jl_codectx_t &ctx, jl_cgval_t *ret, jl_value_t *f, Value *addr = ctx.builder.CreateConstInBoundsGEP1_32(T_prjlvalue, ptr, offs); // emit this using the same type as emit_getfield_knownidx // so that LLVM may be able to load-load forward them and fold the result - fldv = tbaa_decorate(obj.tbaa, ctx.builder.CreateAlignedLoad(T_prjlvalue, addr, sizeof(size_t))); + fldv = tbaa_decorate(obj.tbaa, ctx.builder.CreateAlignedLoad(T_prjlvalue, addr, Align(sizeof(size_t)))); cast(fldv)->setOrdering(AtomicOrdering::Unordered); } else { @@ -3509,7 +3509,7 @@ static Value *global_binding_pointer(jl_codectx_t &ctx, jl_module_t *m, jl_sym_t Constant *initnul = V_null; GlobalVariable *bindinggv = new GlobalVariable(*ctx.f->getParent(), T_pjlvalue, false, GlobalVariable::PrivateLinkage, initnul); - LoadInst *cachedval = ctx.builder.CreateAlignedLoad(T_pjlvalue, bindinggv, sizeof(void*)); + LoadInst *cachedval = ctx.builder.CreateAlignedLoad(T_pjlvalue, bindinggv, Align(sizeof(void*))); cachedval->setOrdering(AtomicOrdering::Unordered); BasicBlock *have_val = BasicBlock::Create(jl_LLVMContext, "found"); BasicBlock *not_found = BasicBlock::Create(jl_LLVMContext, "notfound"); @@ -3520,7 +3520,7 @@ static Value *global_binding_pointer(jl_codectx_t &ctx, jl_module_t *m, jl_sym_t Value *bval = ctx.builder.CreateCall(prepare_call(jlgetbindingorerror_func), { literal_pointer_val(ctx, (jl_value_t*)m), literal_pointer_val(ctx, (jl_value_t*)s) }); - ctx.builder.CreateAlignedStore(bval, bindinggv, sizeof(void*))->setOrdering(AtomicOrdering::Release); + ctx.builder.CreateAlignedStore(bval, bindinggv, Align(sizeof(void*)))->setOrdering(AtomicOrdering::Release); ctx.builder.CreateBr(have_val); ctx.f->getBasicBlockList().push_back(have_val); ctx.builder.SetInsertPoint(have_val); @@ -3539,7 +3539,7 @@ static Value *global_binding_pointer(jl_codectx_t &ctx, jl_module_t *m, jl_sym_t static jl_cgval_t emit_checked_var(jl_codectx_t &ctx, Value *bp, jl_sym_t *name, bool isvol, MDNode *tbaa) { - LoadInst *v = ctx.builder.CreateAlignedLoad(T_prjlvalue, bp, sizeof(void*)); + LoadInst *v = ctx.builder.CreateAlignedLoad(T_prjlvalue, bp, Align(sizeof(void*))); if (isvol) v->setVolatile(true); v->setOrdering(AtomicOrdering::Unordered); @@ -3562,7 +3562,7 @@ static jl_cgval_t emit_sparam(jl_codectx_t &ctx, size_t i) T_prjlvalue, ctx.spvals_ptr, i + sizeof(jl_svec_t) / sizeof(jl_value_t*)); - Value *sp = tbaa_decorate(tbaa_const, ctx.builder.CreateAlignedLoad(T_prjlvalue, bp, sizeof(void*))); + Value *sp = tbaa_decorate(tbaa_const, ctx.builder.CreateAlignedLoad(T_prjlvalue, bp, Align(sizeof(void*)))); Value *isnull = ctx.builder.CreateICmpNE(emit_typeof(ctx, sp), track_pjlvalue(ctx, literal_pointer_val(ctx, (jl_value_t*)jl_tvar_type))); jl_unionall_t *sparam = (jl_unionall_t*)ctx.linfo->def.method->sig; @@ -3585,7 +3585,7 @@ static jl_cgval_t emit_global(jl_codectx_t &ctx, jl_sym_t *sym) // double-check that a global variable is actually defined. this // can be a problem in parallel when a definition is missing on // one machine. - LoadInst *v = ctx.builder.CreateAlignedLoad(T_prjlvalue, bp, sizeof(void*)); + LoadInst *v = ctx.builder.CreateAlignedLoad(T_prjlvalue, bp, Align(sizeof(void*))); v->setOrdering(AtomicOrdering::Unordered); tbaa_decorate(tbaa_binding, v); return mark_julia_type(ctx, v, true, jl_any_type); @@ -3603,15 +3603,15 @@ static jl_cgval_t emit_isdefined(jl_codectx_t &ctx, jl_value_t *sym) return mark_julia_const(jl_true); if (vi.boxroot == NULL || vi.pTIndex != NULL) { assert(vi.defFlag); - isnull = ctx.builder.CreateAlignedLoad(T_int1, vi.defFlag, 1, vi.isVolatile); + isnull = ctx.builder.CreateAlignedLoad(T_int1, vi.defFlag, Align(1), vi.isVolatile); } if (vi.boxroot != NULL) { - Value *boxed = ctx.builder.CreateAlignedLoad(T_prjlvalue, vi.boxroot, sizeof(void*), vi.isVolatile); + Value *boxed = ctx.builder.CreateAlignedLoad(T_prjlvalue, vi.boxroot, Align(sizeof(void*)), vi.isVolatile); Value *box_isnull = ctx.builder.CreateICmpNE(boxed, V_rnull); if (vi.pTIndex) { // value is either boxed in the stack slot, or unboxed in value // as indicated by testing (pTIndex & 0x80) - Value *tindex = ctx.builder.CreateAlignedLoad(T_int8, vi.pTIndex, sizeof(void*), vi.isVolatile); + Value *tindex = ctx.builder.CreateAlignedLoad(T_int8, vi.pTIndex, Align(sizeof(void*)), vi.isVolatile); Value *load_unbox = ctx.builder.CreateICmpEQ( ctx.builder.CreateAnd(tindex, ConstantInt::get(T_int8, 0x80)), ConstantInt::get(T_int8, 0)); @@ -3636,7 +3636,7 @@ static jl_cgval_t emit_isdefined(jl_codectx_t &ctx, jl_value_t *sym) T_prjlvalue, ctx.spvals_ptr, i + sizeof(jl_svec_t) / sizeof(jl_value_t*)); - Value *sp = tbaa_decorate(tbaa_const, ctx.builder.CreateAlignedLoad(T_prjlvalue, bp, sizeof(void*))); + Value *sp = tbaa_decorate(tbaa_const, ctx.builder.CreateAlignedLoad(T_prjlvalue, bp, Align(sizeof(void*)))); isnull = ctx.builder.CreateICmpNE(emit_typeof(ctx, sp), track_pjlvalue(ctx, literal_pointer_val(ctx, (jl_value_t*)jl_tvar_type))); } @@ -3657,7 +3657,7 @@ static jl_cgval_t emit_isdefined(jl_codectx_t &ctx, jl_value_t *sym) if (bnd->value != NULL) return mark_julia_const(jl_true); Value *bp = julia_binding_gv(ctx, bnd); - LoadInst *v = ctx.builder.CreateAlignedLoad(T_prjlvalue, bp, sizeof(void*)); + LoadInst *v = ctx.builder.CreateAlignedLoad(T_prjlvalue, bp, Align(sizeof(void*))); tbaa_decorate(tbaa_binding, v); v->setOrdering(AtomicOrdering::Unordered); isnull = ctx.builder.CreateICmpNE(v, V_rnull); @@ -3681,7 +3681,7 @@ static jl_cgval_t emit_varinfo(jl_codectx_t &ctx, jl_varinfo_t &vi, jl_sym_t *va if ((!vi.isVolatile && vi.isSA) || vi.isArgument || vi.value.constant || !vi.value.V) { v = vi.value; if (vi.pTIndex) - v.TIndex = ctx.builder.CreateAlignedLoad(T_int8, vi.pTIndex, 1); + v.TIndex = ctx.builder.CreateAlignedLoad(T_int8, vi.pTIndex, Align(1)); } else { // copy value to a non-mutable (non-volatile SSA) location @@ -3691,28 +3691,46 @@ static jl_cgval_t emit_varinfo(jl_codectx_t &ctx, jl_varinfo_t &vi, jl_sym_t *va AllocaInst *ssaslot = cast(varslot->clone()); ssaslot->insertAfter(varslot); if (vi.isVolatile) { - Value *unbox = ctx.builder.CreateAlignedLoad(ssaslot->getAllocatedType(), varslot, varslot->getAlignment(), true); - ctx.builder.CreateAlignedStore(unbox, ssaslot, ssaslot->getAlignment()); + Value *unbox = ctx.builder.CreateAlignedLoad(ssaslot->getAllocatedType(), varslot, +#if JL_LLVM_VERSION >= 100000 + varslot->getAlign(), +#else + varslot->getAlignment(), +#endif + true); + ctx.builder.CreateAlignedStore(unbox, ssaslot, +#if JL_LLVM_VERSION >= 100000 + ssaslot->getAlign() +#else + ssaslot->getAlignment() +#endif + ); } else { const DataLayout &DL = jl_data_layout; uint64_t sz = DL.getTypeStoreSize(T); - emit_memcpy(ctx, ssaslot, tbaa_stack, vi.value, sz, ssaslot->getAlignment()); + emit_memcpy(ctx, ssaslot, tbaa_stack, vi.value, sz, +#if JL_LLVM_VERSION >= 100000 + ssaslot->getAlign().value() +#else + ssaslot->getAlignment() +#endif + ); } Value *tindex = NULL; if (vi.pTIndex) - tindex = ctx.builder.CreateAlignedLoad(T_int8, vi.pTIndex, 1, vi.isVolatile); + tindex = ctx.builder.CreateAlignedLoad(T_int8, vi.pTIndex, Align(1), vi.isVolatile); v = mark_julia_slot(ssaslot, vi.value.typ, tindex, tbaa_stack); } if (vi.boxroot == NULL) v = update_julia_type(ctx, v, typ); if (vi.usedUndef) { assert(vi.defFlag); - isnull = ctx.builder.CreateAlignedLoad(T_int1, vi.defFlag, 1, vi.isVolatile); + isnull = ctx.builder.CreateAlignedLoad(T_int1, vi.defFlag, Align(1), vi.isVolatile); } } if (vi.boxroot != NULL) { - Instruction *boxed = ctx.builder.CreateAlignedLoad(T_prjlvalue, vi.boxroot, sizeof(void*), vi.isVolatile); + Instruction *boxed = ctx.builder.CreateAlignedLoad(T_prjlvalue, vi.boxroot, Align(sizeof(void*)), vi.isVolatile); Value *box_isnull = NULL; if (vi.usedUndef) box_isnull = ctx.builder.CreateICmpNE(boxed, V_rnull); @@ -4121,9 +4139,9 @@ static void emit_stmtpos(jl_codectx_t &ctx, jl_value_t *expr, int ssaval_result) else { if (!jl_is_method(ctx.linfo->def.method)) { // TODO: inference is invalid if this has any effect (which it often does) - Value *world = ctx.builder.CreateAlignedLoad(prepare_global_in(jl_Module, jlgetworld_global), sizeof(size_t)); + Value *world = ctx.builder.CreateAlignedLoad(prepare_global_in(jl_Module, jlgetworld_global), Align(sizeof(size_t))); // TODO: world->setOrdering(AtomicOrdering::Monotonic); - ctx.builder.CreateAlignedStore(world, ctx.world_age_field, sizeof(size_t)); + ctx.builder.CreateAlignedStore(world, ctx.world_age_field, Align(sizeof(size_t))); } assert(ssaval_result != -1); emit_ssaval_assign(ctx, ssaval_result, expr); @@ -4576,7 +4594,7 @@ static void emit_cfunc_invalidate( } else { gf_ret = emit_bitcast(ctx, gf_ret, gfrt->getPointerTo()); - ctx.builder.CreateRet(ctx.builder.CreateAlignedLoad(gf_ret, julia_alignment(rettype))); + ctx.builder.CreateRet(ctx.builder.CreateAlignedLoad(gf_ret, Align(julia_alignment(rettype)))); } break; } @@ -4703,11 +4721,11 @@ static Function* gen_cfun_wrapper( // TODO: in the future, try to initialize a full TLS context here // for now, just use a dummy field to avoid a branch in this function ctx.world_age_field = ctx.builder.CreateSelect(have_tls, ctx.world_age_field, dummy_world); - Value *last_age = tbaa_decorate(tbaa_gcframe, ctx.builder.CreateAlignedLoad(ctx.world_age_field, sizeof(size_t))); + Value *last_age = tbaa_decorate(tbaa_gcframe, ctx.builder.CreateAlignedLoad(ctx.world_age_field, Align(sizeof(size_t)))); Value *valid_tls = ctx.builder.CreateIsNotNull(last_age); have_tls = ctx.builder.CreateAnd(have_tls, valid_tls); ctx.world_age_field = ctx.builder.CreateSelect(valid_tls, ctx.world_age_field, dummy_world); - Value *world_v = ctx.builder.CreateAlignedLoad(prepare_global_in(jl_Module, jlgetworld_global), sizeof(size_t)); + Value *world_v = ctx.builder.CreateAlignedLoad(prepare_global_in(jl_Module, jlgetworld_global), Align(sizeof(size_t))); // TODO: cast(world_v)->setOrdering(AtomicOrdering::Monotonic); Value *age_ok = NULL; @@ -4718,7 +4736,7 @@ static Function* gen_cfun_wrapper( T_size, emit_bitcast(ctx, literal_pointer_val(ctx, (jl_value_t*)codeinst), T_psize), offsetof(jl_code_instance_t, max_world) / sizeof(size_t)), - sizeof(size_t)); + Align(sizeof(size_t))); // XXX: age is always OK if we don't have a TLS. This is a hack required due to `@threadcall` abuse. // and adds quite a bit of complexity here, even though it's still wrong // (anything that tries to interact with the runtime will fault) @@ -4739,7 +4757,7 @@ static Function* gen_cfun_wrapper( } else { assert(nest && nestPtr); - Value *ff = ctx.builder.CreateAlignedLoad(T_prjlvalue, nestPtr, sizeof(void*)); + Value *ff = ctx.builder.CreateAlignedLoad(T_prjlvalue, nestPtr, Align(sizeof(void*))); inputargs[0] = mark_julia_type(ctx, ff, true, jl_any_type); } // XXX: these values may need to be rooted until the end of the function @@ -4775,7 +4793,7 @@ static Function* gen_cfun_wrapper( if (aref) { if (jargty == (jl_value_t*)jl_any_type) { inputarg = mark_julia_type(ctx, - ctx.builder.CreateAlignedLoad(T_prjlvalue, emit_bitcast(ctx, val, T_pprjlvalue), sizeof(void*)), + ctx.builder.CreateAlignedLoad(T_prjlvalue, emit_bitcast(ctx, val, T_pprjlvalue), Align(sizeof(void*))), true, jl_any_type); } else if (static_at && jl_is_concrete_immutable(jargty)) { // anything that could be stored unboxed @@ -4788,7 +4806,7 @@ static Function* gen_cfun_wrapper( } else { val = emit_bitcast(ctx, val, T->getPointerTo()); - val = ctx.builder.CreateAlignedLoad(val, 1); // make no alignment assumption about pointer from C + val = ctx.builder.CreateAlignedLoad(val, Align(1)); // make no alignment assumption about pointer from C inputarg = mark_julia_type(ctx, val, false, jargty); } } @@ -4805,7 +4823,7 @@ static Function* gen_cfun_wrapper( jl_array_ptr_1d_push(*closure_types, jargty); Value *runtime_dt = ctx.builder.CreateAlignedLoad(T_prjlvalue, ctx.builder.CreateConstInBoundsGEP1_32(T_prjlvalue, nestPtr, jl_array_len(*closure_types)), - sizeof(void*)); + Align(sizeof(void*))); BasicBlock *boxedBB = BasicBlock::Create(jl_LLVMContext, "isboxed", cw); BasicBlock *loadBB = BasicBlock::Create(jl_LLVMContext, "need-load", cw); BasicBlock *unboxedBB = BasicBlock::Create(jl_LLVMContext, "maybe-unboxed", cw); @@ -4823,7 +4841,7 @@ static Function* gen_cfun_wrapper( ctx.builder.CreateBitCast(val, T_pjlvalue)); ctx.builder.CreateCondBr(isrtany, isanyBB, unboxedBB); ctx.builder.SetInsertPoint(isanyBB); - Value *p2 = ctx.builder.CreateAlignedLoad(T_prjlvalue, ctx.builder.CreateBitCast(val, T_pprjlvalue), sizeof(void*)); + Value *p2 = ctx.builder.CreateAlignedLoad(T_prjlvalue, ctx.builder.CreateBitCast(val, T_pprjlvalue), Align(sizeof(void*))); ctx.builder.CreateBr(afterBB); ctx.builder.SetInsertPoint(unboxedBB); Value *p3 = emit_new_bits(ctx, runtime_dt, val); @@ -4849,7 +4867,7 @@ static Function* gen_cfun_wrapper( assert(jl_is_datatype(jargty)); if (sig.byRefList.at(i)) { assert(cast(val->getType())->getElementType() == sig.fargt[i]); - val = ctx.builder.CreateAlignedLoad(val, 1); // unknown alignment from C + val = ctx.builder.CreateAlignedLoad(val, Align(1)); // unknown alignment from C } else { bool issigned = jl_signed_type && jl_subtype(jargty_proper, (jl_value_t*)jl_signed_type); @@ -4873,7 +4891,7 @@ static Function* gen_cfun_wrapper( jl_array_ptr_1d_push(*closure_types, jargty); Value *runtime_dt = ctx.builder.CreateAlignedLoad(T_prjlvalue, ctx.builder.CreateConstInBoundsGEP1_32(T_prjlvalue, nestPtr, jl_array_len(*closure_types)), - sizeof(void*)); + Align(sizeof(void*))); Value *strct = box_ccall_result(ctx, val, runtime_dt, jargty); inputarg = mark_julia_type(ctx, strct, true, jargty_proper); } @@ -5398,14 +5416,14 @@ static Function *gen_invoke_wrapper(jl_method_instance_t *lam, jl_value_t *jlret else { Value *argPtr = ctx.builder.CreateConstInBoundsGEP1_32(T_prjlvalue, argArray, i - 1); theArg = maybe_mark_load_dereferenceable( - ctx.builder.CreateAlignedLoad(T_prjlvalue, argPtr, sizeof(void*)), + ctx.builder.CreateAlignedLoad(T_prjlvalue, argPtr, Align(sizeof(void*))), false, ty); } if (!isboxed) { theArg = decay_derived(ctx, emit_bitcast(ctx, theArg, PointerType::get(lty, 0))); if (!lty->isAggregateType()) // keep "aggregate" type values in place as pointers - theArg = ctx.builder.CreateAlignedLoad(theArg, julia_alignment(ty)); + theArg = ctx.builder.CreateAlignedLoad(theArg, Align(julia_alignment(ty))); } assert(dyn_cast(theArg) == NULL); args[idx] = theArg; @@ -5422,7 +5440,7 @@ static Function *gen_invoke_wrapper(jl_method_instance_t *lam, jl_value_t *jlret else theArg = ctx.builder.CreateAlignedLoad(T_prjlvalue, ctx.builder.CreateConstInBoundsGEP1_32(T_prjlvalue, argArray, retarg - 1), - sizeof(void*)); + Align(sizeof(void*))); retval = mark_julia_type(ctx, theArg, true, jl_any_type); } else { @@ -5979,7 +5997,7 @@ static std::pair, jl_llvm_functions_t> Value *last_age = NULL; if (toplevel) { emit_last_age_field(ctx); - last_age = tbaa_decorate(tbaa_gcframe, ctx.builder.CreateAlignedLoad(ctx.world_age_field, sizeof(size_t))); + last_age = tbaa_decorate(tbaa_gcframe, ctx.builder.CreateAlignedLoad(ctx.world_age_field, Align(sizeof(size_t)))); } // step 8. allocate local variables slots @@ -6044,7 +6062,8 @@ static std::pair, jl_llvm_functions_t> jl_symbol_name(s), /*InsertBefore*/ctx.ptlsStates); StoreInst *SI = new StoreInst( ConstantPointerNull::get(cast(T_prjlvalue)), av, - false); + false, + Align(sizeof(void*))); SI->insertAfter(ctx.ptlsStates); varinfo.boxroot = av; if (ctx.debug_enabled && varinfo.dinfo) { @@ -6162,7 +6181,7 @@ static std::pair, jl_llvm_functions_t> else { Value *argPtr = ctx.builder.CreateInBoundsGEP(T_prjlvalue, argArray, ConstantInt::get(T_size, i-1)); Value *load = maybe_mark_load_dereferenceable( - ctx.builder.CreateAlignedLoad(T_prjlvalue, argPtr, sizeof(void*)), + ctx.builder.CreateAlignedLoad(T_prjlvalue, argPtr, Align(sizeof(void*))), false, vi.value.typ); theArg = mark_julia_type(ctx, load, true, vi.value.typ); if (ctx.debug_enabled && vi.dinfo && !vi.boxroot && !vi.value.V) { @@ -6613,7 +6632,7 @@ static std::pair, jl_llvm_functions_t> } if (dest_ty != sret->getType()) sret = emit_bitcast(ctx, sret, dest_ty); - ctx.builder.CreateAlignedStore(Val, sret, julia_alignment(retvalinfo.typ)); + ctx.builder.CreateAlignedStore(Val, sret, Align(julia_alignment(retvalinfo.typ))); assert(retvalinfo.TIndex == NULL && "unreachable"); // unimplemented representation } } diff --git a/src/disasm.cpp b/src/disasm.cpp index 409fd76723e4b..fef1ae0a06f33 100644 --- a/src/disasm.cpp +++ b/src/disasm.cpp @@ -46,19 +46,20 @@ #include #include #include -#include "llvm/Support/TargetSelect.h" +#include #include -#include "llvm/Support/FormattedStream.h" +#include +#include #include #include #include -#include "llvm/DebugInfo/DWARF/DWARFContext.h" +#include #include #include #include #include -#include "llvm/IR/AssemblyAnnotationWriter.h" -#include "llvm/IR/LegacyPassManager.h" +#include +#include #include "julia.h" #include "julia_internal.h" @@ -437,7 +438,7 @@ jl_value_t *jl_dump_function_ir(void *f, char strip_ir_metadata, char dump_modul else { Module *m = llvmf->getParent(); if (strip_ir_metadata) { - std::string llvmfn = llvmf->getName(); + std::string llvmfn(llvmf->getName()); jl_strip_llvm_addrspaces(m); jl_strip_llvm_debug(m, true, &AAW); // rewriting the function type creates a new function, so look it up again diff --git a/src/intrinsics.cpp b/src/intrinsics.cpp index c04ea359058ba..9d367f60e35f0 100644 --- a/src/intrinsics.cpp +++ b/src/intrinsics.cpp @@ -341,7 +341,7 @@ static Value *emit_unbox(jl_codectx_t &ctx, Type *to, const jl_cgval_t &x, jl_va Type *dest_ty = unboxed->getType()->getPointerTo(); if (dest->getType() != dest_ty) dest = emit_bitcast(ctx, dest, dest_ty); - tbaa_decorate(tbaa_dest, ctx.builder.CreateAlignedStore(unboxed, dest, julia_alignment(jt))); + tbaa_decorate(tbaa_dest, ctx.builder.CreateAlignedStore(unboxed, dest, Align(julia_alignment(jt)))); return NULL; } @@ -387,12 +387,12 @@ static Value *emit_unbox(jl_codectx_t &ctx, Type *to, const jl_cgval_t &x, jl_va (AllocType->isFloatingPointTy() || AllocType->isIntegerTy() || AllocType->isPointerTy()) && (to->isFloatingPointTy() || to->isIntegerTy() || to->isPointerTy()) && DL.getTypeSizeInBits(AllocType) == DL.getTypeSizeInBits(to)) { - Instruction *load = ctx.builder.CreateAlignedLoad(p, alignment); + Instruction *load = ctx.builder.CreateAlignedLoad(p, Align(alignment)); return emit_unboxed_coercion(ctx, to, tbaa_decorate(x.tbaa, load)); } } p = maybe_bitcast(ctx, p, ptype); - Instruction *load = ctx.builder.CreateAlignedLoad(p, alignment); + Instruction *load = ctx.builder.CreateAlignedLoad(p, Align(alignment)); return tbaa_decorate(x.tbaa, load); } } @@ -580,7 +580,7 @@ static jl_cgval_t emit_pointerref(jl_codectx_t &ctx, jl_cgval_t *argv) Value *thePtr = emit_unbox(ctx, T_pprjlvalue, e, e.typ); return mark_julia_type( ctx, - ctx.builder.CreateAlignedLoad(ctx.builder.CreateInBoundsGEP(T_prjlvalue, thePtr, im1), align_nb), + ctx.builder.CreateAlignedLoad(ctx.builder.CreateInBoundsGEP(T_prjlvalue, thePtr, im1), Align(align_nb)), true, ety); } @@ -655,7 +655,7 @@ static jl_cgval_t emit_pointerset(jl_codectx_t &ctx, jl_cgval_t *argv) thePtr = emit_unbox(ctx, T_psize, e, e.typ); Instruction *store = ctx.builder.CreateAlignedStore( ctx.builder.CreatePtrToInt(emit_pointer_from_objref(ctx, boxed(ctx, x)), T_size), - ctx.builder.CreateInBoundsGEP(T_size, thePtr, im1), align_nb); + ctx.builder.CreateInBoundsGEP(T_size, thePtr, im1), Align(align_nb)); tbaa_decorate(tbaa_data, store); } else if (!jl_isbits(ety)) { diff --git a/src/llvm-alloc-opt.cpp b/src/llvm-alloc-opt.cpp index 8eb44e1383291..6f2a69dea9233 100644 --- a/src/llvm-alloc-opt.cpp +++ b/src/llvm-alloc-opt.cpp @@ -415,7 +415,7 @@ ssize_t Optimizer::getGCAllocSize(Instruction *I) auto call = dyn_cast(I); if (!call) return -1; - if (call->getCalledValue() != pass.alloc_obj_func) + if (call->getCalledOperand() != pass.alloc_obj_func) return -1; assert(call->getNumArgOperands() == 3); size_t sz = (size_t)cast(call->getArgOperand(1))->getZExtValue(); @@ -567,7 +567,7 @@ void Optimizer::checkInst(Instruction *I) if (auto call = dyn_cast(inst)) { // TODO handle `memcmp` // None of the intrinsics should care if the memory is stack or heap allocated. - auto callee = call->getCalledValue(); + auto callee = call->getCalledOperand(); if (auto II = dyn_cast(call)) { if (auto id = II->getIntrinsicID()) { if (id == Intrinsic::memset) { @@ -983,7 +983,7 @@ void Optimizer::moveToStack(CallInst *orig_inst, size_t sz, bool has_ref) user->replaceUsesOfWith(orig_i, new_i); } else if (auto call = dyn_cast(user)) { - auto callee = call->getCalledValue(); + auto callee = call->getCalledOperand(); if (pass.pointer_from_objref_func == callee) { call->replaceAllUsesWith(new_i); call->eraseFromParent(); @@ -1099,7 +1099,7 @@ void Optimizer::removeAlloc(CallInst *orig_inst) return; } else if (auto call = dyn_cast(user)) { - auto callee = call->getCalledValue(); + auto callee = call->getCalledOperand(); if (pass.gc_preserve_begin_func == callee) { removeGCPreserve(call, orig_i); return; @@ -1263,7 +1263,7 @@ void Optimizer::splitOnStack(CallInst *orig_inst) } // TODO: should we use `load->clone()`, or manually copy any other metadata? #if JL_LLVM_VERSION >= 100000 - newload->setAlignment(MaybeAlign(load->getAlignment())); + newload->setAlignment(load->getAlign()); #else newload->setAlignment(load->getAlignment()); #endif @@ -1307,7 +1307,7 @@ void Optimizer::splitOnStack(CallInst *orig_inst) } // TODO: should we use `store->clone()`, or manually copy any other metadata? #if JL_LLVM_VERSION >= 100000 - newstore->setAlignment(MaybeAlign(store->getAlignment())); + newstore->setAlignment(store->getAlign()); #else newstore->setAlignment(store->getAlignment()); #endif @@ -1317,7 +1317,7 @@ void Optimizer::splitOnStack(CallInst *orig_inst) return; } else if (auto call = dyn_cast(user)) { - auto callee = call->getCalledValue(); + auto callee = call->getCalledOperand(); if (auto intrinsic = dyn_cast(call)) { if (Intrinsic::ID id = intrinsic->getIntrinsicID()) { if (id == Intrinsic::memset) { @@ -1344,7 +1344,7 @@ void Optimizer::splitOnStack(CallInst *orig_inst) val = ConstantExpr::getIntToPtr(val, pass.T_pjlvalue); ptr = ConstantExpr::getAddrSpaceCast(val, pass.T_prjlvalue); } - StoreInst *store = builder.CreateAlignedStore(ptr, slot.slot, sizeof(void*)); + StoreInst *store = builder.CreateAlignedStore(ptr, slot.slot, Align(sizeof(void*))); store->setOrdering(AtomicOrdering::NotAtomic); continue; } @@ -1388,7 +1388,7 @@ void Optimizer::splitOnStack(CallInst *orig_inst) for (auto &slot: slots) { if (!slot.isref) continue; - LoadInst *ref = builder.CreateAlignedLoad(pass.T_prjlvalue, slot.slot, sizeof(void*)); + LoadInst *ref = builder.CreateAlignedLoad(pass.T_prjlvalue, slot.slot, Align(sizeof(void*))); // since we're moving heap-to-stack, it is safe to downgrade the atomic level to NotAtomic ref->setOrdering(AtomicOrdering::NotAtomic); operands.push_back(ref); @@ -1419,7 +1419,7 @@ void Optimizer::splitOnStack(CallInst *orig_inst) for (auto &slot: slots) { if (!slot.isref) continue; - LoadInst *ref = builder.CreateAlignedLoad(pass.T_prjlvalue, slot.slot, sizeof(void*)); + LoadInst *ref = builder.CreateAlignedLoad(pass.T_prjlvalue, slot.slot, Align(sizeof(void*))); // since we're moving heap-to-stack, it is safe to downgrade the atomic level to NotAtomic ref->setOrdering(AtomicOrdering::NotAtomic); operands.push_back(ref); diff --git a/src/llvm-api.cpp b/src/llvm-api.cpp index 1ec13fca7918d..3e7030707f049 100644 --- a/src/llvm-api.cpp +++ b/src/llvm-api.cpp @@ -16,7 +16,9 @@ #include #include #include +#if JL_LLVM_VERSION < 110000 #include +#endif #include #include #include diff --git a/src/llvm-final-gc-lowering.cpp b/src/llvm-final-gc-lowering.cpp index 588d73210c5ba..e11df11dcc976 100644 --- a/src/llvm-final-gc-lowering.cpp +++ b/src/llvm-final-gc-lowering.cpp @@ -73,8 +73,8 @@ Value *FinalLowerGC::lowerNewGCFrame(CallInst *target, Function &F) AllocaInst *gcframe = new AllocaInst( T_prjlvalue, 0, - ConstantInt::get(T_int32, nRoots + 2)); - gcframe->setAlignment(Align(16)); + ConstantInt::get(T_int32, nRoots + 2), + Align(16)); gcframe->insertAfter(target); gcframe->takeName(target); @@ -109,20 +109,20 @@ void FinalLowerGC::lowerPushGCFrame(CallInst *target, Function &F) builder.CreateBitCast( builder.CreateConstInBoundsGEP1_32(T_prjlvalue, gcframe, 0), T_size->getPointerTo()), - sizeof(void*)); + Align(sizeof(void*))); inst->setMetadata(LLVMContext::MD_tbaa, tbaa_gcframe); Value *pgcstack = builder.Insert(getPgcstack(ptlsStates)); inst = builder.CreateAlignedStore( - builder.CreateAlignedLoad(pgcstack, sizeof(void*)), + builder.CreateAlignedLoad(pgcstack, Align(sizeof(void*))), builder.CreatePointerCast( builder.CreateConstInBoundsGEP1_32(T_prjlvalue, gcframe, 1), PointerType::get(T_ppjlvalue, 0)), - sizeof(void*)); + Align(sizeof(void*))); inst->setMetadata(LLVMContext::MD_tbaa, tbaa_gcframe); inst = builder.CreateAlignedStore( gcframe, builder.CreateBitCast(pgcstack, PointerType::get(PointerType::get(T_prjlvalue, 0), 0)), - sizeof(void*)); + Align(sizeof(void*))); } void FinalLowerGC::lowerPopGCFrame(CallInst *target, Function &F) @@ -134,14 +134,14 @@ void FinalLowerGC::lowerPopGCFrame(CallInst *target, Function &F) builder.SetInsertPoint(target); Instruction *gcpop = cast(builder.CreateConstInBoundsGEP1_32(T_prjlvalue, gcframe, 1)); - Instruction *inst = builder.CreateAlignedLoad(gcpop, sizeof(void*)); + Instruction *inst = builder.CreateAlignedLoad(gcpop, Align(sizeof(void*))); inst->setMetadata(LLVMContext::MD_tbaa, tbaa_gcframe); inst = builder.CreateAlignedStore( inst, builder.CreateBitCast( builder.Insert(getPgcstack(ptlsStates)), PointerType::get(T_prjlvalue, 0)), - sizeof(void*)); + Align(sizeof(void*))); inst->setMetadata(LLVMContext::MD_tbaa, tbaa_gcframe); } @@ -307,7 +307,7 @@ bool FinalLowerGC::runOnFunction(Function &F) continue; } - auto callee = CI->getCalledValue(); + Value *callee = CI->getCalledOperand(); if (callee == newGCFrameFunc) { replaceInstruction(CI, lowerNewGCFrame(CI, F), it); diff --git a/src/llvm-gc-invariant-verifier.cpp b/src/llvm-gc-invariant-verifier.cpp index 861239f8fc2d4..c1386efef8e72 100644 --- a/src/llvm-gc-invariant-verifier.cpp +++ b/src/llvm-gc-invariant-verifier.cpp @@ -19,7 +19,9 @@ #include #include #include +#if JL_LLVM_VERSION < 110000 #include +#endif #include #include #include diff --git a/src/llvm-julia-licm.cpp b/src/llvm-julia-licm.cpp index c7ef9d0468e09..3242f68df3697 100644 --- a/src/llvm-julia-licm.cpp +++ b/src/llvm-julia-licm.cpp @@ -70,8 +70,8 @@ struct JuliaLICMPass : public LoopPass, public JuliaPassContext { auto call = dyn_cast(&*II++); if (!call) continue; - auto callee = call->getCalledValue(); - assert(callee); + Value *callee = call->getCalledOperand(); + assert(callee != nullptr); // It is always legal to extend the preserve period // so we only need to make sure it is legal to move/clone // the calls. diff --git a/src/llvm-late-gc-lowering.cpp b/src/llvm-late-gc-lowering.cpp index 9a7da9fee9f34..01a981874ec06 100644 --- a/src/llvm-late-gc-lowering.cpp +++ b/src/llvm-late-gc-lowering.cpp @@ -16,7 +16,9 @@ #include #include #include +#if JL_LLVM_VERSION < 110000 #include +#endif #include #include #include @@ -1571,7 +1573,7 @@ static Value *ExtractScalar(Value *V, Type *VTy, bool isptr, ArrayRef Value *GEP = irbuilder.CreateInBoundsGEP(VTy, V, IdxList); Type *T = GetElementPtrInst::getIndexedType(VTy, IdxList); assert(T->isPointerTy()); - V = irbuilder.CreateAlignedLoad(T, GEP, sizeof(void*)); + V = irbuilder.CreateAlignedLoad(T, GEP, Align(sizeof(void*))); // since we're doing stack operations, it should be safe do this non-atomically cast(V)->setOrdering(AtomicOrdering::NotAtomic); } @@ -1650,7 +1652,7 @@ unsigned TrackWithShadow(Value *Src, Type *STy, bool isptr, Value *Dst, IRBuilde Value *Elem = Ptrs[i]; assert(Elem->getType()->isPointerTy()); Value *Slot = irbuilder.CreateConstInBoundsGEP1_32(Elem->getType(), Dst, i); - StoreInst *shadowStore = irbuilder.CreateAlignedStore(Elem, Slot, sizeof(void*)); + StoreInst *shadowStore = irbuilder.CreateAlignedStore(Elem, Slot, Align(sizeof(void*))); shadowStore->setOrdering(AtomicOrdering::NotAtomic); // TODO: shadowStore->setMetadata(LLVMContext::MD_tbaa, tbaa_gcframe); } @@ -2024,7 +2026,7 @@ Value *LateLowerGCFrame::EmitTagPtr(IRBuilder<> &builder, Type *T, Value *V) Value *LateLowerGCFrame::EmitLoadTag(IRBuilder<> &builder, Value *V) { auto addr = EmitTagPtr(builder, T_size, V); - LoadInst *load = builder.CreateAlignedLoad(T_size, addr, sizeof(size_t)); + LoadInst *load = builder.CreateAlignedLoad(T_size, addr, Align(sizeof(size_t))); load->setOrdering(AtomicOrdering::Unordered); load->setMetadata(LLVMContext::MD_tbaa, tbaa_tag); MDBuilder MDB(load->getContext()); @@ -2117,7 +2119,7 @@ bool LateLowerGCFrame::CleanupIR(Function &F, State *S) { continue; } CallingConv::ID CC = CI->getCallingConv(); - auto callee = CI->getCalledValue(); + Value *callee = CI->getCalledOperand(); if (callee && (callee == gc_flush_func || callee == gc_preserve_begin_func || callee == gc_preserve_end_func)) { /* No replacement */ @@ -2181,7 +2183,9 @@ bool LateLowerGCFrame::CleanupIR(Function &F, State *S) { auto tag_type = tag->getType(); if (tag_type->isPointerTy()) { auto &DL = CI->getModule()->getDataLayout(); -#if JL_LLVM_VERSION >= 100000 +#if JL_LLVM_VERSION >= 110000 + auto align = tag->getPointerAlignment(DL).value(); +#elif JL_LLVM_VERSION >= 100000 auto align = tag->getPointerAlignment(DL).valueOrOne().value(); #else auto align = tag->getPointerAlignment(DL); @@ -2195,7 +2199,7 @@ bool LateLowerGCFrame::CleanupIR(Function &F, State *S) { } // Set the tag. StoreInst *store = builder.CreateAlignedStore( - tag, EmitTagPtr(builder, tag_type, newI), sizeof(size_t)); + tag, EmitTagPtr(builder, tag_type, newI), Align(sizeof(size_t))); store->setOrdering(AtomicOrdering::Unordered); store->setMetadata(LLVMContext::MD_tbaa, tbaa_tag); @@ -2247,7 +2251,7 @@ bool LateLowerGCFrame::CleanupIR(Function &F, State *S) { for (; arg_it != CI->arg_end(); ++arg_it) { Builder.CreateAlignedStore(*arg_it, Builder.CreateInBoundsGEP(T_prjlvalue, Frame, ConstantInt::get(T_int32, slot++)), - sizeof(void*)); + Align(sizeof(void*))); } ReplacementArgs.push_back(nframeargs == 0 ? (llvm::Value*)ConstantPointerNull::get(T_pprjlvalue) : diff --git a/src/llvm-lower-handlers.cpp b/src/llvm-lower-handlers.cpp index 2673b05ae81e0..7382f3b74c080 100644 --- a/src/llvm-lower-handlers.cpp +++ b/src/llvm-lower-handlers.cpp @@ -7,15 +7,17 @@ #include #include -#include +#include #include -#include #include #include #include #include +#include +#include #include #include +#include #include "julia.h" #include "julia_assert.h" @@ -183,10 +185,8 @@ bool LowerExcHandlers::runOnFunction(Function &F) { Instruction *firstInst = &F.getEntryBlock().front(); std::vector buffs; for (int i = 0; i < MaxDepth; ++i) { - auto *buff = new AllocaInst(Type::getInt8Ty(F.getContext()), - 0, - handler_sz, "", firstInst); - buff->setAlignment(Align(16)); + auto *buff = new AllocaInst(Type::getInt8Ty(F.getContext()), 0, + handler_sz, Align(16), "", firstInst); buffs.push_back(buff); } diff --git a/src/llvm-pass-helpers.cpp b/src/llvm-pass-helpers.cpp index f724c46505a96..d594408a20992 100644 --- a/src/llvm-pass-helpers.cpp +++ b/src/llvm-pass-helpers.cpp @@ -76,7 +76,7 @@ llvm::CallInst *JuliaPassContext::getPtls(llvm::Function &F) const for (auto I = F.getEntryBlock().begin(), E = F.getEntryBlock().end(); ptls_getter && I != E; ++I) { if (CallInst *callInst = dyn_cast(&*I)) { - if (callInst->getCalledValue() == ptls_getter) { + if (callInst->getCalledOperand() == ptls_getter) { return callInst; } } diff --git a/src/llvm-propagate-addrspaces.cpp b/src/llvm-propagate-addrspaces.cpp index 0a53956a60ff6..95182f144d6ec 100644 --- a/src/llvm-propagate-addrspaces.cpp +++ b/src/llvm-propagate-addrspaces.cpp @@ -16,7 +16,9 @@ #include #include #include +#if JL_LLVM_VERSION < 110000 #include +#endif #include #include #include diff --git a/src/llvm-ptls.cpp b/src/llvm-ptls.cpp index 8687d2bff8111..6fbc40ceff0c4 100644 --- a/src/llvm-ptls.cpp +++ b/src/llvm-ptls.cpp @@ -260,7 +260,7 @@ bool LowerPTLS::runOnModule(Module &_M) for (auto it = ptls_getter->user_begin(); it != ptls_getter->user_end();) { auto call = cast(*it); ++it; - assert(call->getCalledValue() == ptls_getter); + assert(call->getCalledOperand() == ptls_getter); fix_ptls_use(call); } assert(ptls_getter->use_empty()); diff --git a/src/llvm-remove-addrspaces.cpp b/src/llvm-remove-addrspaces.cpp index b2dd0cb70ec39..18d461a545a34 100644 --- a/src/llvm-remove-addrspaces.cpp +++ b/src/llvm-remove-addrspaces.cpp @@ -75,10 +75,14 @@ class AddrspaceRemoveTypeRemapper : public ValueMapTypeRemapper { DstTy = ArrayType::get( remapType(Ty->getElementType()), Ty->getNumElements()); else if (auto Ty = dyn_cast(SrcTy)) - DstTy = VectorType::get( - remapType(Ty->getElementType()), - Ty->getNumElements(), - Ty->isScalable()); + DstTy = VectorType::get(remapType(Ty->getElementType()), +#if JL_LLVM_VERSION >= 110000 + Ty +#else + Ty->getNumElements(), + Ty->isScalable() +#endif + ); if (DstTy != SrcTy) LLVM_DEBUG( diff --git a/src/llvm-version.h b/src/llvm-version.h index a00ccd12c1f5e..8700b3ef416ec 100644 --- a/src/llvm-version.h +++ b/src/llvm-version.h @@ -16,7 +16,13 @@ #define Align(a) (a) #endif +#ifndef LLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING #define LLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING 0 +#endif + +#ifndef LLVM_ENABLE_STATS +#define LLVM_ENABLE_STATS 0 +#endif #if defined(__GNUC__) && (__GNUC__ >= 9) // Added in GCC 9, this warning is annoying