gallivm: don't use vector selects with llvm 3.7
authorRoland Scheidegger <sroland@vmware.com>
Sat, 16 Apr 2016 21:26:46 +0000 (23:26 +0200)
committerRoland Scheidegger <sroland@vmware.com>
Sun, 17 Apr 2016 22:23:34 +0000 (00:23 +0200)
llvm 3.7 sometimes simply miscompiles vector selects.
See https://bugs.freedesktop.org/show_bug.cgi?id=94972

This was fixed in llvm r249669
(https://llvm.org/bugs/show_bug.cgi?id=24532).

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
src/gallium/auxiliary/gallivm/lp_bld_logic.c

index 91f316c45657aebb7d65c7471c7d45aa128deec5..620aece997a4548325d1f68fec580fc37e12deea 100644 (file)
@@ -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.