From 2b4cee05715614acb9dd3823f5665199adcf97c2 Mon Sep 17 00:00:00 2001 From: Jose Fonseca Date: Fri, 10 Jun 2016 15:42:55 +0100 Subject: [PATCH] gallivm: Never emit llvm.fmuladd on LLVM 3.3. 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. Reviewed-by: Roland Scheidegger --- 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 5d6a0335654..114c76665f9 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 5ffe09c9a1b..23ef3edeae7 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 { /* -- 2.30.2