[Mesa-dev] [PATCH v2] llvmpipe: convert double to long long instead of unsigned long long
Oded Gabbay
oded.gabbay at gmail.com
Fri Sep 4 04:11:44 PDT 2015
On Fri, Sep 4, 2015 at 1:17 AM, Roland Scheidegger <sroland at vmware.com> wrote:
> Oh, that's quite a subtle bug...
>
> Reviewed-by: Roland Scheidegger <sroland at vmware.com>
>
Indeed, and it caused over 350 piglit tests to fail on ppc64le.
See before and after:
http://people.freedesktop.org/~gabbayo/ppc64le_imm_fixed/fixes.html
Oded
> 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