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

Ilia Mirkin imirkin at alum.mit.edu
Fri Sep 4 16:04:23 PDT 2015


On Fri, Sep 4, 2015 at 6:57 PM, Matt Turner <mattst88 at gmail.com> wrote:
> On Thu, Sep 3, 2015 at 8:15 AM, Oded Gabbay <oded.gabbay at gmail.com> wrote:
>> 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" <mesa-stable at lists.freedesktop.org>
>> ---
>>  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);
>
> Looks like I'm late to the party, but shouldn't you just use llround()?

Probably... mind mentioning what the (effective) difference is?
Presumably an optimizing compiler with libm knowledge wouldn't care
either way... Even if it's none, probably worth fixing up anyways, but
I'm just curious.


More information about the mesa-dev mailing list