Thread overview
[dmd-internals] 64bit bad codegen from ulong pointers.
Jan 03, 2011
Don Clugston
Jan 03, 2011
Walter Bright
Jan 04, 2011
Don Clugston
Jan 04, 2011
Walter Bright
January 03, 2011
Reduced test case  from std.math. *ps is 0x800F_FFFF_FFFF_FFFF, yet
the if() branch is not taken.
This one looks as though it might be the root cause of many failures.

void check(double x)
{
ulong *ps = cast(ulong *)&x;
if (*ps & 0x8000_0000_0000_0000) {}
else assert(x>=0);
}

void main()
{
  check(-double.min_normal*double.epsilon);
}
January 03, 2011
Works when I try it. Do you have the latest dmd?

Don Clugston wrote:
> Reduced test case  from std.math. *ps is 0x800F_FFFF_FFFF_FFFF, yet
> the if() branch is not taken.
> This one looks as though it might be the root cause of many failures.
>
> void check(double x)
> {
> ulong *ps = cast(ulong *)&x;
> if (*ps & 0x8000_0000_0000_0000) {}
> else assert(x>=0);
> }
>
> void main()
> {
>   check(-double.min_normal*double.epsilon);
> }
>
> 
January 04, 2011
Aargh, it was an incorrect reduction. Here's an larger case which
fails with the latest DMD, Phobos, and druntime.
(Reducing test cases is a bit painful through a remote connection).
-------------
double nextUpw(double x) @trusted nothrow
{
    ulong *ps = cast(ulong *)&x;

    if ((*ps & 0x7FF0_0000_0000_0000) == 0x7FF0_0000_0000_0000) {
        if (x == -x.infinity) return  -x.max;
        return x;
    }
    if (!(*ps & 0x8000_0000_0000_0000L))  {
         assert(x>=0);
    }
    return x;
}

void main()
{
  nextUpw(-double.min_normal*(1.0 - double.epsilon));
}
=========

On 3 January 2011 23:37, Walter Bright <walter at digitalmars.com> wrote:
> Works when I try it. Do you have the latest dmd?
>
> Don Clugston wrote:
>>
>> Reduced test case ?from std.math. *ps is 0x800F_FFFF_FFFF_FFFF, yet
>> the if() branch is not taken.
>> This one looks as though it might be the root cause of many failures.
>>
>> void check(double x)
>> {
>> ulong *ps = cast(ulong *)&x;
>> if (*ps & 0x8000_0000_0000_0000) {}
>> else assert(x>=0);
>> }
>>
>> void main()
>> {
>> ?check(-double.min_normal*double.epsilon);
>> }
>>
>>
>
> _______________________________________________
> dmd-internals mailing list
> dmd-internals at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/dmd-internals
>
January 04, 2011
Good, I can reproduce this one.

BTW, you'll need a 64 bit machine sooner or later! I bought one for about $300 last month (recycling keyboard, mouse, display, and hard disk from an older machine).

Don Clugston wrote:
> Aargh, it was an incorrect reduction. Here's an larger case which
> fails with the latest DMD, Phobos, and druntime.
> (Reducing test cases is a bit painful through a remote connection).
> -------------
> double nextUpw(double x) @trusted nothrow
> {
>     ulong *ps = cast(ulong *)&x;
>
>     if ((*ps & 0x7FF0_0000_0000_0000) == 0x7FF0_0000_0000_0000) {
>         if (x == -x.infinity) return  -x.max;
>         return x;
>     }
>     if (!(*ps & 0x8000_0000_0000_0000L))  {
>          assert(x>=0);
>     }
>     return x;
> }
>
> void main()
> {
>   nextUpw(-double.min_normal*(1.0 - double.epsilon));
> }
> =========
>
> On 3 January 2011 23:37, Walter Bright <walter at digitalmars.com> wrote:
> 
>> Works when I try it. Do you have the latest dmd?
>>
>> Don Clugston wrote:
>> 
>>> Reduced test case  from std.math. *ps is 0x800F_FFFF_FFFF_FFFF, yet
>>> the if() branch is not taken.
>>> This one looks as though it might be the root cause of many failures.
>>>
>>> void check(double x)
>>> {
>>> ulong *ps = cast(ulong *)&x;
>>> if (*ps & 0x8000_0000_0000_0000) {}
>>> else assert(x>=0);
>>> }
>>>
>>> void main()
>>> {
>>>  check(-double.min_normal*double.epsilon);
>>> }
>>>
>>>
>>> 
>> _______________________________________________
>> dmd-internals mailing list
>> dmd-internals at puremagic.com
>> http://lists.puremagic.com/mailman/listinfo/dmd-internals
>>
>> 
> _______________________________________________
> dmd-internals mailing list
> dmd-internals at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/dmd-internals
>
>
>