mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-20 07:20:10 +01:00
amd/llvm: Transition to LLVM "opaque pointers"
For context, see LLVM opaque pointers: https://llvm.org/docs/OpaquePointers.html https://llvm.org/devmtg/2015-10/slides/Blaikie-OpaquePointerTypes.pdf This fixes the deprecation warnings in src/amd/llvm only. Reviewed-by: Marek Olšák <marek.olsak@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15572>
This commit is contained in:
parent
6c0150c389
commit
279eea5bda
4 changed files with 72 additions and 71 deletions
|
|
@ -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, "");
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@
|
|||
|
||||
#include "amd_family.h"
|
||||
#include "compiler/shader_enums.h"
|
||||
#include "llvm-c/Core.h"
|
||||
#include <llvm-c/Core.h>
|
||||
#include "llvm-c/TargetMachine.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue