Mesa (master): ac/nir: fix lsb emission

Connor Abbott cwabbott0 at kemper.freedesktop.org
Tue Aug 1 19:22:12 UTC 2017


Module: Mesa
Branch: master
Commit: 6d731c5651ea98551e0bf0c1a8896d5ea63558d5
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=6d731c5651ea98551e0bf0c1a8896d5ea63558d5

Author: Connor Abbott <cwabbott0 at gmail.com>
Date:   Mon Jul 31 18:28:45 2017 -0700

ac/nir: fix lsb emission

This makes it match radeonsi. The LLVM backend itself will emit the
correct instruction, but LLVM might do incorrect optimizations since it
thinks the output is undefined when the input is 0, even though it's not
supposed to be. We really need a new intrinsic, or for the backend to
become smarter and recognize this pattern.

Cc: mesa-stable at lists.freedesktop.org
Reviewed-by: Bas Nieuwenhuizen <basni at google.com>

---

 src/amd/common/ac_nir_to_llvm.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index 530b5817af..19b1ef0715 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -1187,7 +1187,17 @@ static LLVMValueRef emit_find_lsb(struct ac_llvm_context *ctx,
 		 */
 		LLVMConstInt(ctx->i1, 1, false),
 	};
-	return ac_build_intrinsic(ctx, "llvm.cttz.i32", ctx->i32, params, 2, AC_FUNC_ATTR_READNONE);
+
+	LLVMValueRef lsb = ac_build_intrinsic(ctx, "llvm.cttz.i32", ctx->i32,
+					      params, 2,
+					      AC_FUNC_ATTR_READNONE);
+
+	/* TODO: We need an intrinsic to skip this conditional. */
+	/* Check for zero: */
+	return LLVMBuildSelect(ctx->builder, LLVMBuildICmp(ctx->builder,
+							   LLVMIntEQ, src0,
+							   ctx->i32_0, ""),
+			       LLVMConstInt(ctx->i32, -1, 0), lsb, "");
 }
 
 static LLVMValueRef emit_ifind_msb(struct ac_llvm_context *ctx,




More information about the mesa-commit mailing list