[Mesa-dev] [PATCH] gallivm: set mcpu when initializing llvm execution engine
Vinson Lee
vlee at freedesktop.org
Wed Jun 18 22:11:13 PDT 2014
On Wed, Jun 18, 2014 at 6:28 PM, <sroland at vmware.com> wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> Previously llvm detected cpu features automatically when the execution engine
> was created (based on host cpu). This is no longer the case, which meant llvm
> was then not able to emit some of the intrinsics we used as we didn't specify
> any sse attributes (only on avx supporting systems this was not a problem since
> despite at least some llvm versions enabling it anyway we always set this
> manually). So, instead of trying to figure out which MAttrs to set just set
> MCPU.
>
> This fixes https://bugs.freedesktop.org/show_bug.cgi?id=77493.
> ---
> src/gallium/auxiliary/gallivm/lp_bld_misc.cpp | 22 ++++++++++++++++++++--
> 1 file changed, 20 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp b/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp
> index 38fbe1f..6bea964 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp
> @@ -468,8 +468,8 @@ lp_build_create_jit_compiler_for_module(LLVMExecutionEngineRef *OutJIT,
> /*
> * AVX feature is not automatically detected from CPUID by the X86 target
> * yet, because the old (yet default) JIT engine is not capable of
> - * emitting the opcodes. But as we're using MCJIT here, it is safe to
> - * add set this attribute.
> + * emitting the opcodes. On newer llvm versions it is and at least some
> + * versions (tested with 3.3) will emit avx opcodes without this anyway.
> */
> MAttrs.push_back("+avx");
> if (util_cpu_caps.has_f16c) {
> @@ -478,12 +478,30 @@ lp_build_create_jit_compiler_for_module(LLVMExecutionEngineRef *OutJIT,
> builder.setMAttrs(MAttrs);
> }
>
> +#if HAVE_LLVM >= 0x0305
> + StringRef MCPU = llvm::sys::getHostCPUName();
> + /*
> + * The cpu bits are no longer set automatically, so need to set mcpu manually.
> + * Note that the MAttrs set above will be sort of ignored (since we should
> + * not set any which would not be set by specifying the cpu anyway).
> + * It ought to be safe though since getHostCPUName() should include bits
> + * not only from the cpu but environment as well (for instance if it's safe
> + * to use avx instructions which need OS support). According to
> + * http://llvm.org/bugs/show_bug.cgi?id=19429 however if I understand this
> + * right it may be necessary to specify older cpu (or disable mattrs) though
> + * when not using MCJIT so no instructions are generated which the old JIT
> + * can't handle. Not entirely sure if we really need to do anything yet.
> + */
> + builder.setMCPU(MCPU);
> +#endif
> +
> ShaderMemoryManager *MM = new ShaderMemoryManager();
> *OutCode = MM->getGeneratedCode();
>
> builder.setJITMemoryManager(MM);
>
> ExecutionEngine *JIT;
> +
> #if HAVE_LLVM >= 0x0302
> JIT = builder.create();
> #else
> --
> 1.9.1
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
This patch fixes the bug for me.
Tested-by: Vinson Lee <vlee at freedesktop.org>
More information about the mesa-dev
mailing list