gallivm: Emit vector selects.
authorJosé Fonseca <jfonseca@vmware.com>
Fri, 19 Apr 2013 13:04:15 +0000 (14:04 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Sat, 20 Apr 2013 22:25:36 +0000 (23:25 +0100)
They are supported on LLVM 3.1, at least on x86. (I haven't tested on PPC
though.)

Actually lp_build_linear_mip_levels() already has been emitting them for
some time.

This avoids intrinsics, which tend to be an obstacle for certain
optimization passes.

Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/auxiliary/gallivm/lp_bld_logic.c

index f56b61bf24891212624e4943a8cdef9838c5cec1..cdb7e0ad5445a6c668bdaccaa5dca95990377c57 100644 (file)
@@ -458,20 +458,10 @@ lp_build_select(struct lp_build_context *bld,
       mask = LLVMBuildTrunc(builder, mask, LLVMInt1TypeInContext(lc), "");
       res = LLVMBuildSelect(builder, mask, a, b, "");
    }
-   else if (0) {
+   else if (HAVE_LLVM >= 0x301) {
       /* Generate a vector select.
        *
-       * XXX: Using vector selects would avoid emitting intrinsics, but they aren't
-       * properly supported yet.
-       *
-       * LLVM 3.0 includes experimental support provided the -promote-elements
-       * options is passed to LLVM's command line (e.g., via
-       * llvm::cl::ParseCommandLineOptions), but resulting code quality is much
-       * worse, probably because some optimization passes don't know how to
-       * handle vector selects.
-       *
-       * See also:
-       * - http://lists.cs.uiuc.edu/pipermail/llvmdev/2011-October/043659.html
+       * Only supported on LLVM 3.1 onwards
        */
 
       /* Convert the mask to a vector of booleans.