[Mesa-dev] [PATCH] gallivm: Workaround LLVM PR 27332.

Roland Scheidegger sroland at vmware.com
Wed Apr 13 15:32:14 UTC 2016


Am 13.04.2016 um 16:45 schrieb Jose Fonseca:
> The credit for finding and isolating this bug goes to Vinson and Roland.
> 
> The buggy LLVM versions were found by doing
> 
>   opt -instcombine llvm-pr27332.ll > /dev/null
> 
> where llvm-pr27332.ll is the IR from
> https://llvm.org/bugs/show_bug.cgi?id=27332#c3
> ---
>  src/gallium/auxiliary/gallivm/lp_bld_arit.c | 17 ++++++++++++++---
>  1 file changed, 14 insertions(+), 3 deletions(-)
> 
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_arit.c b/src/gallium/auxiliary/gallivm/lp_bld_arit.c
> index 9cb745e..beff414 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_arit.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_arit.c
> @@ -1492,9 +1492,20 @@ lp_build_abs(struct lp_build_context *bld,
>        return a;
>  
>     if(type.floating) {
> -      char intrinsic[32];
> -      lp_format_intrinsic(intrinsic, sizeof intrinsic, "llvm.fabs", vec_type);
> -      return lp_build_intrinsic_unary(builder, intrinsic, vec_type, a);
> +      if (0x0306 <= HAVE_LLVM && HAVE_LLVM < 0x0309) {
> +         /* Workaround llvm.org/PR27332 */
> +         LLVMTypeRef int_vec_type = lp_build_int_vec_type(bld->gallivm, type);
> +         unsigned long long absMask = ~(1ULL << (type.width - 1));
> +         LLVMValueRef mask = lp_build_const_int_vec(bld->gallivm, type, ((unsigned long long) absMask));
> +         a = LLVMBuildBitCast(builder, a, int_vec_type, "");
> +         a = LLVMBuildAnd(builder, a, mask, "");
> +         a = LLVMBuildBitCast(builder, a, vec_type, "");
> +         return a;
> +      } else {
> +         char intrinsic[32];
> +         lp_format_intrinsic(intrinsic, sizeof intrinsic, "llvm.fabs", vec_type);
> +         return lp_build_intrinsic_unary(builder, intrinsic, vec_type, a);
> +      }
>     }
>  
>     if(type.width*type.length == 128 && util_cpu_caps.has_ssse3) {
> 

Reviewed-by: Roland Scheidegger <sroland at vmware.com>

So, there actually indeed is a benefit from using fabs over an and -
llvm apparently uses it to know numbers can't be negative (not that it
couldn't recognize it with the and...).

Thanks!



More information about the mesa-dev mailing list