[Mesa-dev] [PATCH] gallivm: Never emit llvm.fmuladd on LLVM 3.3.

Roland Scheidegger sroland at vmware.com
Fri Jun 10 15:00:39 UTC 2016


Am 10.06.2016 um 16:45 schrieb Jose Fonseca:
> Besides the old JIT bug, it seems the X86 backend on LLVM 3.3 doesn't
> handle llvm.fmuladd and instead it fall backs to a C function.  Which in
> turn causes a segfault on Windows.
> ---
>  src/gallium/auxiliary/gallivm/lp_bld_arit.c   | 6 ++++++
>  src/gallium/auxiliary/gallivm/lp_bld_misc.cpp | 2 +-
>  2 files changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_arit.c b/src/gallium/auxiliary/gallivm/lp_bld_arit.c
> index 5d6a033..114c766 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_arit.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_arit.c
> @@ -270,6 +270,12 @@ lp_build_fmuladd(LLVMBuilderRef builder,
>     LLVMTypeRef type = LLVMTypeOf(a);
>     assert(type == LLVMTypeOf(b));
>     assert(type == LLVMTypeOf(c));
> +   if (HAVE_LLVM < 0x0304) {
> +      /* XXX: LLVM 3.3 does not breakdown llvm.fmuladd into mul+add when FMA is
> +       * not supported, and instead it falls-back to a C function.
> +       */
> +      return LLVMBuildFAdd(builder, LLVMBuildFMul(builder, a, b, ""), c, "");
> +   }
>     char intrinsic[32];
>     lp_format_intrinsic(intrinsic, sizeof intrinsic, "llvm.fmuladd", type);
>     LLVMValueRef args[] = { a, b, c };
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp b/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp
> index 5ffe09c..23ef3ed 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp
> @@ -570,7 +570,7 @@ lp_build_create_jit_compiler_for_module(LLVMExecutionEngineRef *OutJIT,
>      */
>     MAttrs.push_back(util_cpu_caps.has_avx  ? "+avx"  : "-avx");
>     MAttrs.push_back(util_cpu_caps.has_f16c ? "+f16c" : "-f16c");
> -   if (HAVE_LLVM >= 0x0304 || useMCJIT) {
> +   if (HAVE_LLVM >= 0x0304) {
>        MAttrs.push_back(util_cpu_caps.has_fma  ? "+fma"  : "-fma");
>     } else {
>        /*
> 

Oh, llvm 3.3 is so epic fail with fmuladd... Considering it wasn't even
new (fmuladd was introduced in 3.2) that's quite disappointing...

Reviewed-by: Roland Scheidegger <sroland at vmware.com>


More information about the mesa-dev mailing list