[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