ac/nir: fix 64-bit shifts
authorConnor Abbott <cwabbott0@gmail.com>
Sat, 1 Jul 2017 02:10:43 +0000 (19:10 -0700)
committerConnor Abbott <cwabbott0@gmail.com>
Mon, 3 Jul 2017 18:58:59 +0000 (11:58 -0700)
NIR always makes the shift amount 32 bits, but LLVM asserts if the two
sources aren't the same type. Zero-extend the shift amount to make LLVM
happy.

Signed-off-by: Connor Abbott <cwabbott0@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/common/ac_nir_to_llvm.c

index 88f3f44e92ca6482ba573528a7bc3868fbe53ddf..e72747ab78aac6d55aa6c29fa622e19d48fd8e13 100644 (file)
@@ -1621,13 +1621,22 @@ static void visit_alu(struct nir_to_llvm_context *ctx, const nir_alu_instr *inst
                result = LLVMBuildXor(ctx->builder, src[0], src[1], "");
                break;
        case nir_op_ishl:
-               result = LLVMBuildShl(ctx->builder, src[0], src[1], "");
+               result = LLVMBuildShl(ctx->builder, src[0],
+                                     LLVMBuildZExt(ctx->builder, src[1],
+                                                   LLVMTypeOf(src[0]), ""),
+                                     "");
                break;
        case nir_op_ishr:
-               result = LLVMBuildAShr(ctx->builder, src[0], src[1], "");
+               result = LLVMBuildAShr(ctx->builder, src[0],
+                                      LLVMBuildZExt(ctx->builder, src[1],
+                                                    LLVMTypeOf(src[0]), ""),
+                                      "");
                break;
        case nir_op_ushr:
-               result = LLVMBuildLShr(ctx->builder, src[0], src[1], "");
+               result = LLVMBuildLShr(ctx->builder, src[0],
+                                      LLVMBuildZExt(ctx->builder, src[1],
+                                                    LLVMTypeOf(src[0]), ""),
+                                      "");
                break;
        case nir_op_ilt:
                result = emit_int_cmp(&ctx->ac, LLVMIntSLT, src[0], src[1]);