Mesa (master): gallivm: don't use vector selects with llvm 3.7
Roland Scheidegger
sroland at kemper.freedesktop.org
Sun Apr 17 22:24:39 UTC 2016
Module: Mesa
Branch: master
Commit: d11111a5510815afb73f3a863330ddf51d5021df
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d11111a5510815afb73f3a863330ddf51d5021df
Author: Roland Scheidegger <sroland at vmware.com>
Date: Sat Apr 16 23:26:46 2016 +0200
gallivm: don't use vector selects with llvm 3.7
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 at vmware.com>
---
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-commit
mailing list