ac: avoid casting pointers on bcsel and stores
For variable pointers we really don't want to case the pointers to int without a good reason, just add a wrapper for bcsel loading and result storing. Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
parent
a999798daa
commit
ec9fe8abc7
|
@ -229,6 +229,15 @@ ac_to_integer(struct ac_llvm_context *ctx, LLVMValueRef v)
|
||||||
return LLVMBuildBitCast(ctx->builder, v, ac_to_integer_type(ctx, type), "");
|
return LLVMBuildBitCast(ctx->builder, v, ac_to_integer_type(ctx, type), "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LLVMValueRef
|
||||||
|
ac_to_integer_or_pointer(struct ac_llvm_context *ctx, LLVMValueRef v)
|
||||||
|
{
|
||||||
|
LLVMTypeRef type = LLVMTypeOf(v);
|
||||||
|
if (LLVMGetTypeKind(type) == LLVMPointerTypeKind)
|
||||||
|
return v;
|
||||||
|
return ac_to_integer(ctx, v);
|
||||||
|
}
|
||||||
|
|
||||||
static LLVMTypeRef to_float_type_scalar(struct ac_llvm_context *ctx, LLVMTypeRef t)
|
static LLVMTypeRef to_float_type_scalar(struct ac_llvm_context *ctx, LLVMTypeRef t)
|
||||||
{
|
{
|
||||||
if (t == ctx->i16 || t == ctx->f16)
|
if (t == ctx->i16 || t == ctx->f16)
|
||||||
|
|
|
@ -128,6 +128,7 @@ unsigned ac_get_type_size(LLVMTypeRef type);
|
||||||
|
|
||||||
LLVMTypeRef ac_to_integer_type(struct ac_llvm_context *ctx, LLVMTypeRef t);
|
LLVMTypeRef ac_to_integer_type(struct ac_llvm_context *ctx, LLVMTypeRef t);
|
||||||
LLVMValueRef ac_to_integer(struct ac_llvm_context *ctx, LLVMValueRef v);
|
LLVMValueRef ac_to_integer(struct ac_llvm_context *ctx, LLVMValueRef v);
|
||||||
|
LLVMValueRef ac_to_integer_or_pointer(struct ac_llvm_context *ctx, LLVMValueRef v);
|
||||||
LLVMTypeRef ac_to_float_type(struct ac_llvm_context *ctx, LLVMTypeRef t);
|
LLVMTypeRef ac_to_float_type(struct ac_llvm_context *ctx, LLVMTypeRef t);
|
||||||
LLVMValueRef ac_to_float(struct ac_llvm_context *ctx, LLVMValueRef v);
|
LLVMValueRef ac_to_float(struct ac_llvm_context *ctx, LLVMValueRef v);
|
||||||
|
|
||||||
|
|
|
@ -270,8 +270,9 @@ static LLVMValueRef emit_bcsel(struct ac_llvm_context *ctx,
|
||||||
{
|
{
|
||||||
LLVMValueRef v = LLVMBuildICmp(ctx->builder, LLVMIntNE, src0,
|
LLVMValueRef v = LLVMBuildICmp(ctx->builder, LLVMIntNE, src0,
|
||||||
ctx->i32_0, "");
|
ctx->i32_0, "");
|
||||||
return LLVMBuildSelect(ctx->builder, v, ac_to_integer(ctx, src1),
|
return LLVMBuildSelect(ctx->builder, v,
|
||||||
ac_to_integer(ctx, src2), "");
|
ac_to_integer_or_pointer(ctx, src1),
|
||||||
|
ac_to_integer_or_pointer(ctx, src2), "");
|
||||||
}
|
}
|
||||||
|
|
||||||
static LLVMValueRef emit_minmax_int(struct ac_llvm_context *ctx,
|
static LLVMValueRef emit_minmax_int(struct ac_llvm_context *ctx,
|
||||||
|
@ -1095,7 +1096,7 @@ static void visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr)
|
||||||
|
|
||||||
if (result) {
|
if (result) {
|
||||||
assert(instr->dest.dest.is_ssa);
|
assert(instr->dest.dest.is_ssa);
|
||||||
result = ac_to_integer(&ctx->ac, result);
|
result = ac_to_integer_or_pointer(&ctx->ac, result);
|
||||||
ctx->ssa_defs[instr->dest.dest.ssa.index] = result;
|
ctx->ssa_defs[instr->dest.dest.ssa.index] = result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue