[Mesa-dev] [PATCH] gallivm: don't use vector selects with llvm 3.7

Jose Fonseca jfonseca at vmware.com
Sun Apr 17 09:06:28 UTC 2016


On 16/04/16 22:30, sroland at vmware.com wrote:
> From: Roland Scheidegger <sroland at vmware.com>
>
> llvm 3.7 sometimes simply miscompiles vector selects.

Reviewed-by: Jose Fonseca <jfonseca at vmware.com>

> See https://bugs.freedesktop.org/show_bug.cgi?id=94972

Great detective work.

I think you should make a LLVM test case out of the IR on that bug and 
propose on llvm-commits, to guarantee it won't regress again.  See 
test/CodeGen/X86/vselect-avx.ll for example.

Jose

> ---
>   src/gallium/auxiliary/gallivm/lp_bld_logic.c | 8 +++++---
>   1 file changed, 5 insertions(+), 3 deletions(-)
>
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_logic.c b/src/gallium/auxiliary/gallivm/lp_bld_logic.c
> index 91f316c..620aece 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_logic.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_logic.c
> @@ -315,14 +315,16 @@ lp_build_select(struct lp_build_context *bld,
>         mask = LLVMBuildTrunc(builder, mask, LLVMInt1TypeInContext(lc), "");
>         res = LLVMBuildSelect(builder, mask, a, b, "");
>      }
> -   else if (LLVMIsConstant(mask) ||
> -            LLVMGetInstructionOpcode(mask) == LLVMSExt) {
> +   else if (!(HAVE_LLVM == 0x0307) &&
> +            (LLVMIsConstant(mask) ||
> +             LLVMGetInstructionOpcode(mask) == LLVMSExt)) {
>         /* Generate a vector select.
>          *
>          * Using vector selects should avoid emitting intrinsics hence avoid
> -       * hidering optimization passes, but vector selects weren't properly
> +       * hindering optimization passes, but vector selects weren't properly
>          * supported yet for a long time, and LLVM will generate poor code when
>          * the mask is not the result of a comparison.
> +       * Also, llvm 3.7 may miscompile them (bug 94972).
>          */
>
>         /* Convert the mask to a vector of booleans.
>






More information about the mesa-dev mailing list