Mesa (master): gallivm: fix half to float conversions with llvm 11

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Apr 30 01:46:26 UTC 2020


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

Author: Roland Scheidegger <sroland at vmware.com>
Date:   Wed Apr 29 06:38:12 2020 +0200

gallivm: fix half to float conversions with llvm 11

LLVM 11 removes the intrinsic for half to float conversion, so use the fpext
function instead. This function actually works now with half to float, albeit
a quick experiment showed at least the x86 backend cannot lower it itself if
the cpu doesn't support it natively and tries to call external library, which
crashes (and would be very slow anyway as it would be lowered to scalar code),
so for now only use it where we previously used the f16c intrinsic.

Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/2603

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4800>

---

 src/gallium/auxiliary/gallivm/lp_bld_conv.c | 34 ++++++++++++++++++++---------
 1 file changed, 24 insertions(+), 10 deletions(-)

diff --git a/src/gallium/auxiliary/gallivm/lp_bld_conv.c b/src/gallium/auxiliary/gallivm/lp_bld_conv.c
index 1321545808a..51eb3c31aee 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_conv.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_conv.c
@@ -103,19 +103,33 @@ lp_build_half_to_float(struct gallivm_state *gallivm,
 
    if (util_cpu_caps.has_f16c &&
        (src_length == 4 || src_length == 8)) {
-      const char *intrinsic = NULL;
-      if (src_length == 4) {
-         src = lp_build_pad_vector(gallivm, src, 8);
-         intrinsic = "llvm.x86.vcvtph2ps.128";
-      }
-      else {
-         intrinsic = "llvm.x86.vcvtph2ps.256";
+      if (LLVM_VERSION_MAJOR < 11) {
+         const char *intrinsic = NULL;
+         if (src_length == 4) {
+            src = lp_build_pad_vector(gallivm, src, 8);
+            intrinsic = "llvm.x86.vcvtph2ps.128";
+         }
+         else {
+            intrinsic = "llvm.x86.vcvtph2ps.256";
+         }
+         return lp_build_intrinsic_unary(builder, intrinsic,
+                                         lp_build_vec_type(gallivm, f32_type), src);
+      } else {
+         /*
+          * XXX: could probably use on other archs as well.
+          * But if the cpu doesn't support it natively it looks like the backends still
+          * can't lower it and will try to call out to external libraries, which will crash.
+          */
+         /*
+          * XXX: lp_build_vec_type() would use int16 vector. Probably need to revisit
+          * this at some point.
+          */
+         src = LLVMBuildBitCast(builder, src,
+                                LLVMVectorType(LLVMHalfTypeInContext(gallivm->context), src_length), "");
+         return LLVMBuildFPExt(builder, src, lp_build_vec_type(gallivm, f32_type), "");
       }
-      return lp_build_intrinsic_unary(builder, intrinsic,
-                                      lp_build_vec_type(gallivm, f32_type), src);
    }
 
-   /* Convert int16 vector to int32 vector by zero ext (might generate bad code) */
    h = LLVMBuildZExt(builder, src, int_vec_type, "");
    return lp_build_smallfloat_to_float(gallivm, f32_type, h, 10, 5, 0, true);
 }



More information about the mesa-commit mailing list