[Mesa-dev] [PATCH v2] llvmpipe: convert double to long long instead of unsigned long long

Roland Scheidegger sroland at vmware.com
Thu Sep 3 15:17:01 PDT 2015


Oh, that's quite a subtle bug...

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

Am 03.09.2015 um 18:00 schrieb Oded Gabbay:
> round(val*dscale) produces a double result, as val and dscale are double.
> However, LLVMConstInt receives unsigned long long, so there is an
> implicit conversion from double to unsigned long long.
> This is an undefined behavior. Therefore, we need to first explicitly
> convert the round result to long long, and then let the compiler handle
> conversion from that to unsigned long long.
> 
> This bug manifests itself in POWER, where all IMM values of -1 are being
> converted to 0 implicitly, causing a wrong LLVM IR output.
> 
> Signed-off-by: Oded Gabbay <oded.gabbay at gmail.com>
> CC: "10.6 11.0" <mesa-stable at lists.freedesktop.org>
> Reviewed-by: Tom Stellard <thomas.stellard at amd.com>
> ---
>  src/gallium/auxiliary/gallivm/lp_bld_const.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/src/gallium/auxiliary/gallivm/lp_bld_const.c b/src/gallium/auxiliary/gallivm/lp_bld_const.c
> index 0f5a8f8..9cd7c55 100644
> --- a/src/gallium/auxiliary/gallivm/lp_bld_const.c
> +++ b/src/gallium/auxiliary/gallivm/lp_bld_const.c
> @@ -311,7 +311,7 @@ lp_build_const_elem(struct gallivm_state *gallivm,
>     else {
>        double dscale = lp_const_scale(type);
>  
> -      elem = LLVMConstInt(elem_type, round(val*dscale), 0);
> +      elem = LLVMConstInt(elem_type, (long long) round(val*dscale), 0);
>     }
>  
>     return elem;
> 



More information about the mesa-dev mailing list