diff --git a/src/amd/llvm/ac_llvm_build.c b/src/amd/llvm/ac_llvm_build.c index 4fcd8f4da7a..33836b6d18e 100644 --- a/src/amd/llvm/ac_llvm_build.c +++ b/src/amd/llvm/ac_llvm_build.c @@ -294,21 +294,20 @@ LLVMValueRef ac_build_intrinsic(struct ac_llvm_context *ctx, const char *name, LLVMTypeRef return_type, LLVMValueRef *params, unsigned param_count, unsigned attrib_mask) { - LLVMValueRef function, call; + LLVMValueRef call; bool set_callsite_attrs = !(attrib_mask & AC_FUNC_ATTR_LEGACY); - function = LLVMGetNamedFunction(ctx->module, name); + LLVMTypeRef param_types[32]; + assert(param_count <= 32); + for (unsigned i = 0; i < param_count; ++i) { + assert(params[i]); + param_types[i] = LLVMTypeOf(params[i]); + } + + LLVMTypeRef function_type = LLVMFunctionType(return_type, param_types, param_count, 0); + LLVMValueRef function = LLVMGetNamedFunction(ctx->module, name); + if (!function) { - LLVMTypeRef param_types[32], function_type; - unsigned i; - - assert(param_count <= 32); - - for (i = 0; i < param_count; ++i) { - assert(params[i]); - param_types[i] = LLVMTypeOf(params[i]); - } - function_type = LLVMFunctionType(return_type, param_types, param_count, 0); function = LLVMAddFunction(ctx->module, name, function_type); LLVMSetFunctionCallConv(function, LLVMCCallConv); @@ -318,7 +317,7 @@ LLVMValueRef ac_build_intrinsic(struct ac_llvm_context *ctx, const char *name, ac_add_func_attributes(ctx->context, function, attrib_mask); } - call = LLVMBuildCall(ctx->builder, function, params, param_count, ""); + call = LLVMBuildCall2(ctx->builder, function_type, function, params, param_count, ""); if (set_callsite_attrs) ac_add_func_attributes(ctx->context, call, attrib_mask); return call; @@ -420,27 +419,27 @@ void ac_build_optimization_barrier(struct ac_llvm_context *ctx, LLVMValueRef *pg if (!pgpr) { LLVMTypeRef ftype = LLVMFunctionType(ctx->voidt, NULL, 0, false); LLVMValueRef inlineasm = LLVMConstInlineAsm(ftype, code, "", true, false); - LLVMBuildCall(builder, inlineasm, NULL, 0, ""); + LLVMBuildCall2(builder, ftype, inlineasm, NULL, 0, ""); } else if (LLVMTypeOf(*pgpr) == ctx->i32) { /* Simple version for i32 that allows the caller to set LLVM metadata on the call * instruction. */ LLVMTypeRef ftype = LLVMFunctionType(ctx->i32, &ctx->i32, 1, false); LLVMValueRef inlineasm = LLVMConstInlineAsm(ftype, code, constraint, true, false); - *pgpr = LLVMBuildCall(builder, inlineasm, pgpr, 1, ""); + *pgpr = LLVMBuildCall2(builder, ftype, inlineasm, pgpr, 1, ""); } else if (LLVMTypeOf(*pgpr) == ctx->i16) { /* Simple version for i16 that allows the caller to set LLVM metadata on the call * instruction. */ LLVMTypeRef ftype = LLVMFunctionType(ctx->i16, &ctx->i16, 1, false); LLVMValueRef inlineasm = LLVMConstInlineAsm(ftype, code, constraint, true, false); - *pgpr = LLVMBuildCall(builder, inlineasm, pgpr, 1, ""); + *pgpr = LLVMBuildCall2(builder, ftype, inlineasm, pgpr, 1, ""); } else if (LLVMGetTypeKind(LLVMTypeOf(*pgpr)) == LLVMPointerTypeKind) { LLVMTypeRef type = LLVMTypeOf(*pgpr); LLVMTypeRef ftype = LLVMFunctionType(type, &type, 1, false); LLVMValueRef inlineasm = LLVMConstInlineAsm(ftype, code, constraint, true, false); - *pgpr = LLVMBuildCall(builder, inlineasm, pgpr, 1, ""); + *pgpr = LLVMBuildCall2(builder, ftype, inlineasm, pgpr, 1, ""); } else { LLVMTypeRef ftype = LLVMFunctionType(ctx->i32, &ctx->i32, 1, false); LLVMValueRef inlineasm = LLVMConstInlineAsm(ftype, code, constraint, true, false); @@ -461,7 +460,7 @@ void ac_build_optimization_barrier(struct ac_llvm_context *ctx, LLVMValueRef *pg vgpr = LLVMBuildBitCast(builder, vgpr, LLVMVectorType(ctx->i32, vgpr_size / 4), ""); vgpr0 = LLVMBuildExtractElement(builder, vgpr, ctx->i32_0, ""); - vgpr0 = LLVMBuildCall(builder, inlineasm, &vgpr0, 1, ""); + vgpr0 = LLVMBuildCall2(builder, ftype, inlineasm, &vgpr0, 1, ""); vgpr = LLVMBuildInsertElement(builder, vgpr, vgpr0, ctx->i32_0, ""); vgpr = LLVMBuildBitCast(builder, vgpr, vgpr_type, ""); @@ -574,7 +573,7 @@ LLVMValueRef ac_build_varying_gather_values(struct ac_llvm_context *ctx, LLVMVal } LLVMValueRef ac_build_gather_values_extended(struct ac_llvm_context *ctx, LLVMValueRef *values, - unsigned value_count, unsigned value_stride, bool load, + unsigned value_count, unsigned value_stride, bool always_vector) { LLVMBuilderRef builder = ctx->builder; @@ -582,16 +581,12 @@ LLVMValueRef ac_build_gather_values_extended(struct ac_llvm_context *ctx, LLVMVa unsigned i; if (value_count == 1 && !always_vector) { - if (load) - return LLVMBuildLoad(builder, values[0], ""); return values[0]; } else if (!value_count) unreachable("value_count is 0"); for (i = 0; i < value_count; i++) { LLVMValueRef value = values[i * value_stride]; - if (load) - value = LLVMBuildLoad(builder, value, ""); if (!i) vec = LLVMGetUndef(LLVMVectorType(LLVMTypeOf(value), value_count)); @@ -604,7 +599,7 @@ LLVMValueRef ac_build_gather_values_extended(struct ac_llvm_context *ctx, LLVMVa LLVMValueRef ac_build_gather_values(struct ac_llvm_context *ctx, LLVMValueRef *values, unsigned value_count) { - return ac_build_gather_values_extended(ctx, values, value_count, 1, false, false); + return ac_build_gather_values_extended(ctx, values, value_count, 1, false); } LLVMValueRef ac_build_concat(struct ac_llvm_context *ctx, LLVMValueRef a, LLVMValueRef b) @@ -1031,8 +1026,8 @@ LLVMValueRef ac_build_gep0(struct ac_llvm_context *ctx, LLVMValueRef base_ptr, L LLVMValueRef ac_build_pointer_add(struct ac_llvm_context *ctx, LLVMValueRef ptr, LLVMValueRef index) { - return LLVMBuildPointerCast(ctx->builder, LLVMBuildGEP(ctx->builder, ptr, &index, 1, ""), - LLVMTypeOf(ptr), ""); + LLVMValueRef offset_ptr = LLVMBuildGEP(ctx->builder, ptr, &index, 1, ""); + return LLVMBuildPointerCast(ctx->builder, offset_ptr, LLVMTypeOf(ptr), ""); } void ac_build_indexed_store(struct ac_llvm_context *ctx, LLVMValueRef base_ptr, LLVMValueRef index, @@ -1315,7 +1310,7 @@ LLVMValueRef ac_build_buffer_load_format(struct ac_llvm_context *ctx, LLVMValueR LLVMValueRef args[] = {ac_build_gather_values(ctx, addr_comp, 2), LLVMBuildBitCast(ctx->builder, rsrc, ctx->v4i32, "")}; - LLVMValueRef res = LLVMBuildCall(ctx->builder, inlineasm, args, 2, ""); + LLVMValueRef res = LLVMBuildCall2(ctx->builder, calltype, inlineasm, args, 2, ""); return ac_build_concat(ctx, ac_trim_vector(ctx, res, num_channels), ac_llvm_extract_elem(ctx, res, 4)); @@ -2359,7 +2354,7 @@ LLVMValueRef ac_build_cvt_pknorm_i16_f16(struct ac_llvm_context *ctx, LLVMValueRef code = LLVMConstInlineAsm(calltype, "v_cvt_pknorm_i16_f16 $0, $1, $2", "=v,v,v", false, false); - return LLVMBuildCall(ctx->builder, code, args, 2, ""); + return LLVMBuildCall2(ctx->builder, calltype, code, args, 2, ""); } LLVMValueRef ac_build_cvt_pknorm_u16_f16(struct ac_llvm_context *ctx, @@ -2370,7 +2365,7 @@ LLVMValueRef ac_build_cvt_pknorm_u16_f16(struct ac_llvm_context *ctx, LLVMValueRef code = LLVMConstInlineAsm(calltype, "v_cvt_pknorm_u16_f16 $0, $1, $2", "=v,v,v", false, false); - return LLVMBuildCall(ctx->builder, code, args, 2, ""); + return LLVMBuildCall2(ctx->builder, calltype, code, args, 2, ""); } /* The 8-bit and 10-bit clamping is for HW workarounds. */ @@ -2998,7 +2993,7 @@ void ac_declare_lds_as_pointer(struct ac_llvm_context *ctx) LLVMValueRef ac_lds_load(struct ac_llvm_context *ctx, LLVMValueRef dw_addr) { - return LLVMBuildLoad(ctx->builder, ac_build_gep0(ctx, ctx->lds, dw_addr), ""); + return LLVMBuildLoad2(ctx->builder, ctx->i32, ac_build_gep0(ctx, ctx->lds, dw_addr), ""); } void ac_lds_store(struct ac_llvm_context *ctx, LLVMValueRef dw_addr, LLVMValueRef value) @@ -3194,7 +3189,7 @@ static void ac_branch_exited(struct ac_llvm_context *ctx) * * This is an optional optimization that only kills whole inactive quads. */ - LLVMValueRef cond = LLVMBuildLoad(ctx->builder, ctx->postponed_kill, ""); + LLVMValueRef cond = LLVMBuildLoad2(ctx->builder, ctx->i1, ctx->postponed_kill, ""); ac_build_kill_if_false(ctx, ac_build_wqm_vote(ctx, cond)); ctx->conditional_demote_seen = false; } @@ -4195,7 +4190,8 @@ void ac_build_wg_wavescan_top(struct ac_llvm_context *ctx, struct ac_wg_scan *ws tmp = LLVMBuildICmp(builder, LLVMIntEQ, tid, last_lane, ""); ac_build_ifcc(ctx, tmp, 1000); - LLVMBuildStore(builder, ws->src, LLVMBuildGEP(builder, ws->scratch, &ws->waveidx, 1, "")); + LLVMBuildStore(builder, ws->src, + LLVMBuildGEP2(builder, LLVMTypeOf(ws->src), ws->scratch, &ws->waveidx, 1, "")); ac_build_endif(ctx, 1000); } @@ -4235,7 +4231,8 @@ void ac_build_wg_wavescan_bottom(struct ac_llvm_context *ctx, struct ac_wg_scan tmp = LLVMBuildICmp(builder, LLVMIntULT, tid, ws->waveidx, ""); ac_build_ifcc(ctx, tmp, 1001); { - tmp = LLVMBuildLoad(builder, LLVMBuildGEP(builder, ws->scratch, &tid, 1, ""), ""); + tmp = LLVMBuildLoad2(builder, LLVMTypeOf(ws->src), + LLVMBuildGEP2(builder, LLVMTypeOf(ws->src), ws->scratch, &tid, 1, ""), ""); ac_build_optimization_barrier(ctx, &tmp, false); @@ -4472,7 +4469,7 @@ LLVMValueRef ac_build_is_helper_invocation(struct ac_llvm_context *ctx) LLVMValueRef exact = ac_build_intrinsic(ctx, "llvm.amdgcn.ps.live", ctx->i1, NULL, 0, AC_FUNC_ATTR_READNONE); - LLVMValueRef postponed = LLVMBuildLoad(ctx->builder, ctx->postponed_kill, ""); + LLVMValueRef postponed = LLVMBuildLoad2(ctx->builder, ctx->i1, ctx->postponed_kill, ""); return LLVMBuildNot(ctx->builder, LLVMBuildAnd(ctx->builder, exact, postponed, ""), ""); } @@ -4745,7 +4742,7 @@ void ac_build_s_endpgm(struct ac_llvm_context *ctx) { LLVMTypeRef calltype = LLVMFunctionType(ctx->voidt, NULL, 0, false); LLVMValueRef code = LLVMConstInlineAsm(calltype, "s_endpgm", "", true, false); - LLVMBuildCall(ctx->builder, code, NULL, 0, ""); + LLVMBuildCall2(ctx->builder, calltype, code, NULL, 0, ""); } /** diff --git a/src/amd/llvm/ac_llvm_build.h b/src/amd/llvm/ac_llvm_build.h index 03d03737a3c..488a5400fe4 100644 --- a/src/amd/llvm/ac_llvm_build.h +++ b/src/amd/llvm/ac_llvm_build.h @@ -192,7 +192,7 @@ LLVMValueRef ac_build_varying_gather_values(struct ac_llvm_context *ctx, LLVMVal unsigned value_count, unsigned component); LLVMValueRef ac_build_gather_values_extended(struct ac_llvm_context *ctx, LLVMValueRef *values, - unsigned value_count, unsigned value_stride, bool load, + unsigned value_count, unsigned value_stride, bool always_vector); LLVMValueRef ac_build_gather_values(struct ac_llvm_context *ctx, LLVMValueRef *values, unsigned value_count); diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c index 429ef1e3e8b..1789073b172 100644 --- a/src/amd/llvm/ac_nir_to_llvm.c +++ b/src/amd/llvm/ac_nir_to_llvm.c @@ -87,7 +87,7 @@ static LLVMValueRef get_src(struct ac_nir_context *nir, nir_src src) return nir->ssa_defs[src.ssa->index]; } -static LLVMValueRef get_memory_ptr(struct ac_nir_context *ctx, nir_src src, unsigned bit_size, unsigned c_off) +static LLVMValueRef get_memory_ptr_t(struct ac_nir_context *ctx, nir_src src, LLVMTypeRef elem_type, unsigned c_off) { LLVMValueRef ptr = get_src(ctx, src); LLVMValueRef lds_i8 = ctx->ac.lds; @@ -95,12 +95,15 @@ static LLVMValueRef get_memory_ptr(struct ac_nir_context *ctx, nir_src src, unsi lds_i8 = LLVMBuildBitCast(ctx->ac.builder, ctx->ac.lds, LLVMPointerType(ctx->ac.i8, AC_ADDR_SPACE_LDS), ""); ptr = LLVMBuildAdd(ctx->ac.builder, ptr, LLVMConstInt(ctx->ac.i32, c_off, 0), ""); - ptr = LLVMBuildGEP(ctx->ac.builder, lds_i8, &ptr, 1, ""); + ptr = LLVMBuildGEP2(ctx->ac.builder, ctx->ac.i8, lds_i8, &ptr, 1, ""); int addr_space = LLVMGetPointerAddressSpace(LLVMTypeOf(ptr)); - LLVMTypeRef type = LLVMIntTypeInContext(ctx->ac.context, bit_size); + return LLVMBuildBitCast(ctx->ac.builder, ptr, LLVMPointerType(elem_type, addr_space), ""); +} - return LLVMBuildBitCast(ctx->ac.builder, ptr, LLVMPointerType(type, addr_space), ""); +static LLVMValueRef get_memory_ptr(struct ac_nir_context *ctx, nir_src src, unsigned bit_size, unsigned c_off) +{ + return get_memory_ptr_t(ctx, src, LLVMIntTypeInContext(ctx->ac.context, bit_size), c_off); } static LLVMBasicBlockRef get_block(struct ac_nir_context *nir, const struct nir_block *b) @@ -1675,14 +1678,13 @@ static LLVMValueRef visit_load_push_constant(struct ac_nir_context *ctx, nir_int } } - ptr = - LLVMBuildGEP(ctx->ac.builder, ac_get_arg(&ctx->ac, ctx->args->push_constants), &addr, 1, ""); + ptr = LLVMBuildGEP(ctx->ac.builder, ac_get_arg(&ctx->ac, ctx->args->push_constants), &addr, 1, ""); if (instr->dest.ssa.bit_size == 8) { unsigned load_dwords = instr->dest.ssa.num_components > 1 ? 2 : 1; LLVMTypeRef vec_type = LLVMVectorType(ctx->ac.i8, 4 * load_dwords); ptr = ac_cast_ptr(&ctx->ac, ptr, vec_type); - LLVMValueRef res = LLVMBuildLoad(ctx->ac.builder, ptr, ""); + LLVMValueRef res = LLVMBuildLoad2(ctx->ac.builder, vec_type, ptr, ""); LLVMValueRef params[3]; if (load_dwords > 1) { @@ -1710,7 +1712,7 @@ static LLVMValueRef visit_load_push_constant(struct ac_nir_context *ctx, nir_int unsigned load_dwords = instr->dest.ssa.num_components / 2 + 1; LLVMTypeRef vec_type = LLVMVectorType(ctx->ac.i16, 2 * load_dwords); ptr = ac_cast_ptr(&ctx->ac, ptr, vec_type); - LLVMValueRef res = LLVMBuildLoad(ctx->ac.builder, ptr, ""); + LLVMValueRef res = LLVMBuildLoad2(ctx->ac.builder, vec_type, ptr, ""); res = LLVMBuildBitCast(ctx->ac.builder, res, vec_type, ""); LLVMValueRef cond = LLVMBuildLShr(ctx->ac.builder, addr, ctx->ac.i32_1, ""); cond = LLVMBuildTrunc(ctx->ac.builder, cond, ctx->ac.i1, ""); @@ -1728,9 +1730,10 @@ static LLVMValueRef visit_load_push_constant(struct ac_nir_context *ctx, nir_int return LLVMBuildBitCast(ctx->ac.builder, res, get_def_type(ctx, &instr->dest.ssa), ""); } - ptr = ac_cast_ptr(&ctx->ac, ptr, get_def_type(ctx, &instr->dest.ssa)); + LLVMTypeRef ptr_type = get_def_type(ctx, &instr->dest.ssa); + ptr = ac_cast_ptr(&ctx->ac, ptr, ptr_type); - return LLVMBuildLoad(ctx->ac.builder, ptr, ""); + return LLVMBuildLoad2(ctx->ac.builder, ptr_type, ptr, ""); } static LLVMValueRef visit_get_ssbo_size(struct ac_nir_context *ctx, @@ -1797,7 +1800,7 @@ static LLVMValueRef enter_waterfall_ssbo(struct ac_nir_context *ctx, struct wate static void visit_store_ssbo(struct ac_nir_context *ctx, nir_intrinsic_instr *instr) { if (ctx->ac.postponed_kill) { - LLVMValueRef cond = LLVMBuildLoad(ctx->ac.builder, ctx->ac.postponed_kill, ""); + LLVMValueRef cond = LLVMBuildLoad2(ctx->ac.builder, ctx->ac.i1, ctx->ac.postponed_kill, ""); ac_build_ifcc(&ctx->ac, cond, 7000); } @@ -1954,7 +1957,7 @@ static LLVMValueRef emit_ssbo_comp_swap_64(struct ac_nir_context *ctx, LLVMValue static LLVMValueRef visit_atomic_ssbo(struct ac_nir_context *ctx, nir_intrinsic_instr *instr) { if (ctx->ac.postponed_kill) { - LLVMValueRef cond = LLVMBuildLoad(ctx->ac.builder, ctx->ac.postponed_kill, ""); + LLVMValueRef cond = LLVMBuildLoad2(ctx->ac.builder, ctx->ac.i1, ctx->ac.postponed_kill, ""); ac_build_ifcc(&ctx->ac, cond, 7001); } @@ -2128,7 +2131,7 @@ static LLVMValueRef visit_load_global(struct ac_nir_context *ctx, addr = LLVMBuildIntToPtr(ctx->ac.builder, addr, ptr_type, ""); - val = LLVMBuildLoad(ctx->ac.builder, addr, ""); + val = LLVMBuildLoad2(ctx->ac.builder, result_type, addr, ""); if (nir_intrinsic_access(instr) & (ACCESS_COHERENT | ACCESS_VOLATILE)) { LLVMSetOrdering(val, LLVMAtomicOrderingMonotonic); @@ -2142,7 +2145,7 @@ static void visit_store_global(struct ac_nir_context *ctx, nir_intrinsic_instr *instr) { if (ctx->ac.postponed_kill) { - LLVMValueRef cond = LLVMBuildLoad(ctx->ac.builder, ctx->ac.postponed_kill, ""); + LLVMValueRef cond = LLVMBuildLoad2(ctx->ac.builder, ctx->ac.i1, ctx->ac.postponed_kill, ""); ac_build_ifcc(&ctx->ac, cond, 7002); } @@ -2170,7 +2173,7 @@ static LLVMValueRef visit_global_atomic(struct ac_nir_context *ctx, nir_intrinsic_instr *instr) { if (ctx->ac.postponed_kill) { - LLVMValueRef cond = LLVMBuildLoad(ctx->ac.builder, ctx->ac.postponed_kill, ""); + LLVMValueRef cond = LLVMBuildLoad2(ctx->ac.builder, ctx->ac.i1, ctx->ac.postponed_kill, ""); ac_build_ifcc(&ctx->ac, cond, 7002); } @@ -2305,7 +2308,7 @@ static unsigned type_scalar_size_bytes(const struct glsl_type *type) static void visit_store_output(struct ac_nir_context *ctx, nir_intrinsic_instr *instr) { if (ctx->ac.postponed_kill) { - LLVMValueRef cond = LLVMBuildLoad(ctx->ac.builder, ctx->ac.postponed_kill, ""); + LLVMValueRef cond = LLVMBuildLoad2(ctx->ac.builder, ctx->ac.i1, ctx->ac.postponed_kill, ""); ac_build_ifcc(&ctx->ac, cond, 7002); } @@ -2363,8 +2366,7 @@ static void visit_store_output(struct ac_nir_context *ctx, nir_intrinsic_instr * * using read-modify-write. */ index = LLVMConstInt(ctx->ac.i32, nir_intrinsic_io_semantics(instr).high_16bits, 0); - output = LLVMBuildLoad(ctx->ac.builder, output_addr, ""); - output = LLVMBuildBitCast(ctx->ac.builder, output, ctx->ac.v2f16, ""); + output = LLVMBuildLoad2(ctx->ac.builder, ctx->ac.v2f16, output_addr, ""); output = LLVMBuildInsertElement(ctx->ac.builder, output, value, index, ""); value = LLVMBuildBitCast(ctx->ac.builder, output, ctx->ac.f32, ""); } @@ -2621,7 +2623,7 @@ static void visit_image_store(struct ac_nir_context *ctx, const nir_intrinsic_in bool bindless) { if (ctx->ac.postponed_kill) { - LLVMValueRef cond = LLVMBuildLoad(ctx->ac.builder, ctx->ac.postponed_kill, ""); + LLVMValueRef cond = LLVMBuildLoad2(ctx->ac.builder, ctx->ac.i1, ctx->ac.postponed_kill, ""); ac_build_ifcc(&ctx->ac, cond, 7003); } @@ -2695,7 +2697,7 @@ static LLVMValueRef visit_image_atomic(struct ac_nir_context *ctx, const nir_int bool bindless) { if (ctx->ac.postponed_kill) { - LLVMValueRef cond = LLVMBuildLoad(ctx->ac.builder, ctx->ac.postponed_kill, ""); + LLVMValueRef cond = LLVMBuildLoad2(ctx->ac.builder, ctx->ac.i1, ctx->ac.postponed_kill, ""); ac_build_ifcc(&ctx->ac, cond, 7004); } @@ -2984,7 +2986,7 @@ static void emit_demote(struct ac_nir_context *ctx, const nir_intrinsic_instr *i return; } - LLVMValueRef mask = LLVMBuildLoad(ctx->ac.builder, ctx->ac.postponed_kill, ""); + LLVMValueRef mask = LLVMBuildLoad2(ctx->ac.builder, ctx->ac.i1, ctx->ac.postponed_kill, ""); mask = LLVMBuildAnd(ctx->ac.builder, mask, cond, ""); LLVMBuildStore(ctx->ac.builder, mask, ctx->ac.postponed_kill); @@ -3082,12 +3084,13 @@ static LLVMValueRef visit_load_shared(struct ac_nir_context *ctx, const nir_intr LLVMValueRef values[4], derived_ptr, index, ret; unsigned const_off = nir_intrinsic_base(instr); - LLVMValueRef ptr = get_memory_ptr(ctx, instr->src[0], instr->dest.ssa.bit_size, const_off); + LLVMTypeRef elem_type = LLVMIntTypeInContext(ctx->ac.context, instr->dest.ssa.bit_size); + LLVMValueRef ptr = get_memory_ptr_t(ctx, instr->src[0], elem_type, const_off); for (int chan = 0; chan < instr->num_components; chan++) { index = LLVMConstInt(ctx->ac.i32, chan, 0); - derived_ptr = LLVMBuildGEP(ctx->ac.builder, ptr, &index, 1, ""); - values[chan] = LLVMBuildLoad(ctx->ac.builder, derived_ptr, ""); + derived_ptr = LLVMBuildGEP2(ctx->ac.builder, elem_type, ptr, &index, 1, ""); + values[chan] = LLVMBuildLoad2(ctx->ac.builder, elem_type, derived_ptr, ""); } ret = ac_build_gather_values(&ctx->ac, values, instr->num_components); @@ -3101,7 +3104,8 @@ static void visit_store_shared(struct ac_nir_context *ctx, const nir_intrinsic_i LLVMBuilderRef builder = ctx->ac.builder; unsigned const_off = nir_intrinsic_base(instr); - LLVMValueRef ptr = get_memory_ptr(ctx, instr->src[1], instr->src[0].ssa->bit_size, const_off); + LLVMTypeRef elem_type = LLVMIntTypeInContext(ctx->ac.context, instr->src[0].ssa->bit_size); + LLVMValueRef ptr = get_memory_ptr_t(ctx, instr->src[1], elem_type, const_off); LLVMValueRef src = get_src(ctx, instr->src[0]); int writemask = nir_intrinsic_write_mask(instr); @@ -3111,7 +3115,7 @@ static void visit_store_shared(struct ac_nir_context *ctx, const nir_intrinsic_i } data = ac_llvm_extract_elem(&ctx->ac, src, chan); index = LLVMConstInt(ctx->ac.i32, chan, 0); - derived_ptr = LLVMBuildGEP(builder, ptr, &index, 1, ""); + derived_ptr = LLVMBuildGEP2(builder, elem_type, ptr, &index, 1, ""); LLVMBuildStore(builder, data, derived_ptr); } } @@ -3120,7 +3124,7 @@ static LLVMValueRef visit_var_atomic(struct ac_nir_context *ctx, const nir_intri LLVMValueRef ptr, int src_idx) { if (ctx->ac.postponed_kill) { - LLVMValueRef cond = LLVMBuildLoad(ctx->ac.builder, ctx->ac.postponed_kill, ""); + LLVMValueRef cond = LLVMBuildLoad2(ctx->ac.builder, ctx->ac.i1, ctx->ac.postponed_kill, ""); ac_build_ifcc(&ctx->ac, cond, 7005); } @@ -4095,7 +4099,7 @@ static void visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *ins : LLVMVectorType(comp_type, instr->dest.ssa.num_components); unsigned addr_space = LLVMGetPointerAddressSpace(LLVMTypeOf(ptr)); ptr = LLVMBuildBitCast(ctx->ac.builder, ptr, LLVMPointerType(vec_type, addr_space), ""); - result = LLVMBuildLoad(ctx->ac.builder, ptr, ""); + result = LLVMBuildLoad2(ctx->ac.builder, vec_type, ptr, ""); break; } case nir_intrinsic_store_scratch: { @@ -4111,7 +4115,7 @@ static void visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *ins u_bit_scan_consecutive_range(&wrmask, &start, &count); LLVMValueRef offset = LLVMConstInt(ctx->ac.i32, start, false); - LLVMValueRef offset_ptr = LLVMBuildGEP(ctx->ac.builder, ptr, &offset, 1, ""); + LLVMValueRef offset_ptr = LLVMBuildGEP2(ctx->ac.builder, comp_type, ptr, &offset, 1, ""); LLVMTypeRef vec_type = count == 1 ? comp_type : LLVMVectorType(comp_type, count); offset_ptr = LLVMBuildBitCast(ctx->ac.builder, offset_ptr, LLVMPointerType(vec_type, addr_space), ""); @@ -4141,7 +4145,7 @@ static void visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *ins : LLVMVectorType(comp_type, instr->dest.ssa.num_components); unsigned addr_space = LLVMGetPointerAddressSpace(LLVMTypeOf(ptr)); ptr = LLVMBuildBitCast(ctx->ac.builder, ptr, LLVMPointerType(vec_type, addr_space), ""); - result = LLVMBuildLoad(ctx->ac.builder, ptr, ""); + result = LLVMBuildLoad2(ctx->ac.builder, vec_type, ptr, ""); break; } case nir_intrinsic_set_vertex_and_primitive_count: @@ -4302,11 +4306,11 @@ static void visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *ins LLVMTypeRef byte_ptr_type = LLVMPointerType(ctx->ac.i8, AC_ADDR_SPACE_CONST); LLVMValueRef addr = LLVMBuildIntToPtr(ctx->ac.builder, base, byte_ptr_type, ""); - addr = LLVMBuildGEP(ctx->ac.builder, addr, &offset, 1, ""); + addr = LLVMBuildGEP2(ctx->ac.builder, ctx->ac.i8, addr, &offset, 1, ""); addr = LLVMBuildBitCast(ctx->ac.builder, addr, ptr_type, ""); LLVMSetMetadata(addr, ctx->ac.uniform_md_kind, ctx->ac.empty_md); - result = LLVMBuildLoad(ctx->ac.builder, addr, ""); + result = LLVMBuildLoad2(ctx->ac.builder, result_type, addr, ""); LLVMSetMetadata(result, ctx->ac.invariant_load_md_kind, ctx->ac.empty_md); break; } @@ -5014,7 +5018,7 @@ static void visit_ssa_undef(struct ac_nir_context *ctx, const nir_ssa_undef_inst } else { LLVMValueRef zero = LLVMConstInt(type, 0, false); if (num_components > 1) { - zero = ac_build_gather_values_extended(&ctx->ac, &zero, 4, 0, false, false); + zero = ac_build_gather_values_extended(&ctx->ac, &zero, 4, 0, false); } ctx->ssa_defs[instr->def.index] = zero; } @@ -5436,7 +5440,7 @@ void ac_nir_translate(struct ac_llvm_context *ac, struct ac_shader_abi *abi, phi_post_pass(&ctx); if (ctx.ac.postponed_kill) - ac_build_kill_if_false(&ctx.ac, LLVMBuildLoad(ctx.ac.builder, ctx.ac.postponed_kill, "")); + ac_build_kill_if_false(&ctx.ac, LLVMBuildLoad2(ctx.ac.builder, ctx.ac.i1, ctx.ac.postponed_kill, "")); if (!gl_shader_stage_is_compute(nir->info.stage)) ctx.abi->emit_outputs(ctx.abi); diff --git a/src/amd/llvm/ac_nir_to_llvm.h b/src/amd/llvm/ac_nir_to_llvm.h index 3d495c77c14..f4ed35a0153 100644 --- a/src/amd/llvm/ac_nir_to_llvm.h +++ b/src/amd/llvm/ac_nir_to_llvm.h @@ -26,7 +26,7 @@ #include "amd_family.h" #include "compiler/shader_enums.h" -#include "llvm-c/Core.h" +#include #include "llvm-c/TargetMachine.h" #include