ac/nir: fix integer comparisons with pointers
[mesa.git] / src / amd / llvm / ac_nir_to_llvm.c
index 8a707c93666becfeb71505de5be66faf1e60e9ce..b90a7e3dcf2b58055a2bf2fbcf1090a84a11531e 100644 (file)
@@ -170,6 +170,17 @@ static LLVMValueRef emit_int_cmp(struct ac_llvm_context *ctx,
                                  LLVMIntPredicate pred, LLVMValueRef src0,
                                  LLVMValueRef src1)
 {
+       LLVMTypeRef src0_type = LLVMTypeOf(src0);
+       LLVMTypeRef src1_type = LLVMTypeOf(src1);
+
+       if (LLVMGetTypeKind(src0_type) == LLVMPointerTypeKind &&
+           LLVMGetTypeKind(src1_type) != LLVMPointerTypeKind) {
+               src1 = LLVMBuildIntToPtr(ctx->builder, src1, src0_type, "");
+       } else if (LLVMGetTypeKind(src1_type) == LLVMPointerTypeKind &&
+                  LLVMGetTypeKind(src0_type) != LLVMPointerTypeKind) {
+               src0 = LLVMBuildIntToPtr(ctx->builder, src0, src1_type, "");
+       }
+
        LLVMValueRef result = LLVMBuildICmp(ctx->builder, pred, src0, src1, "");
        return LLVMBuildSelect(ctx->builder, result,
                               LLVMConstInt(ctx->i32, 0xFFFFFFFF, false),
@@ -971,7 +982,7 @@ static void visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr)
                        }
 
                        assert(ac_get_llvm_num_components(src[0]) == 1);
-                       LLVMValueRef param[2] = { src[0], ctx->ac.f32_0 };
+                       LLVMValueRef param[2] = { src[0], LLVMGetUndef(ctx->ac.f32) };
                        result = ac_build_cvt_pkrtz_f16(&ctx->ac, param);
                        result = LLVMBuildExtractElement(ctx->ac.builder, result, ctx->ac.i32_0, "");
                } else {
@@ -4043,7 +4054,7 @@ static void visit_intrinsic(struct ac_nir_context *ctx,
        case nir_intrinsic_shuffle:
                if (ctx->ac.chip_class == GFX8 ||
                    ctx->ac.chip_class == GFX9 ||
-                   (ctx->ac.chip_class == GFX10 && ctx->ac.wave_size == 32)) {
+                   (ctx->ac.chip_class >= GFX10 && ctx->ac.wave_size == 32)) {
                        result = ac_build_shuffle(&ctx->ac, get_src(ctx, instr->src[0]),
                                                  get_src(ctx, instr->src[1]));
                } else {