ac: avoid casting pointers on bcsel and stores
authorDave Airlie <airlied@redhat.com>
Mon, 19 Nov 2018 03:00:36 +0000 (13:00 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 20 Nov 2018 22:54:25 +0000 (08:54 +1000)
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>
src/amd/common/ac_llvm_build.c
src/amd/common/ac_llvm_build.h
src/amd/common/ac_nir_to_llvm.c

index 22245aadba171398266e7f0b80cc45f10e8950e9..abc18da13dbba7dc43340b77b71816a96d2a7047 100644 (file)
@@ -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), "");
 }
 
+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)
 {
        if (t == ctx->i16 || t == ctx->f16)
index 1275e4fb6986e29fba1f437e57fc647025d88ccf..e90c8c21ad4ebf2dd462cd08616542357c57d9ca 100644 (file)
@@ -128,6 +128,7 @@ unsigned ac_get_type_size(LLVMTypeRef type);
 
 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_or_pointer(struct ac_llvm_context *ctx, LLVMValueRef v);
 LLVMTypeRef ac_to_float_type(struct ac_llvm_context *ctx, LLVMTypeRef t);
 LLVMValueRef ac_to_float(struct ac_llvm_context *ctx, LLVMValueRef v);
 
index c7fc676abde2cc189085de5649eed9c088ac6755..fb350f1ff7850fb5fad2e4858ac0bed0d75286b0 100644 (file)
@@ -270,8 +270,9 @@ static LLVMValueRef emit_bcsel(struct ac_llvm_context *ctx,
 {
        LLVMValueRef v = LLVMBuildICmp(ctx->builder, LLVMIntNE, src0,
                                       ctx->i32_0, "");
-       return LLVMBuildSelect(ctx->builder, v, ac_to_integer(ctx, src1),
-                              ac_to_integer(ctx, src2), "");
+       return LLVMBuildSelect(ctx->builder, v,
+                              ac_to_integer_or_pointer(ctx, src1),
+                              ac_to_integer_or_pointer(ctx, src2), "");
 }
 
 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) {
                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;
        }
 }