From 2eddf91faf4abf0b3d7b81a0a486fd46d5acd1ea Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Fri, 24 Jan 2014 14:25:46 +0000 Subject: [PATCH] gallivm: Workaround http://llvm.org/PR18600 We have code generation paths that carry out swizzles of AoS vectors via bitwise shifts, as these tend to generate more efficient code than straightforward byte shuffles. But when the input is a constant the additional bitwise arithmetic operations somehow don't really get constant propagated properly, evenutally causing assertion failure in InstCombine pass. Therefore avoid the bug by using the trivial shuffles for constant inputs. Although the sample LLVM IR can cause a crash with any LLVM version, this was only seen in practice with LLVM 3.2. Reviewed-by: Matthew McClure Reviewed-by: Roland Scheidegger --- src/gallium/auxiliary/gallivm/lp_bld_swizzle.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/gallium/auxiliary/gallivm/lp_bld_swizzle.c b/src/gallium/auxiliary/gallivm/lp_bld_swizzle.c index 79116bcf391..9557e1c10de 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_swizzle.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_swizzle.c @@ -180,7 +180,8 @@ lp_build_swizzle_scalar_aos(struct lp_build_context *bld, /* XXX: SSE3 has PSHUFB which should be better than bitmasks, but forcing * using shuffles here actually causes worst results. More investigation is * needed. */ - if (type.width >= 16) { + if (LLVMIsConstant(a) || + type.width >= 16) { /* * Shuffle. */ @@ -398,7 +399,8 @@ lp_build_swizzle_aos(struct lp_build_context *bld, } } - if (type.width >= 16) { + if (LLVMIsConstant(a) || + type.width >= 16) { /* * Shuffle. */ -- 2.30.2