[Issue 24884] New: backend generates wrong 32-bit code after inlining math with double[4]

d-bugmail at puremagic.com d-bugmail at puremagic.com
Tue Nov 26 12:15:10 UTC 2024


https://issues.dlang.org/show_bug.cgi?id=24884

          Issue ID: 24884
           Summary: backend generates wrong 32-bit code after inlining
                    math with double[4]
           Product: D
           Version: D2
          Hardware: x86
                OS: Windows
            Status: NEW
          Keywords: wrong-code
          Severity: major
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: dkorpel at live.nl

On Windows, with -m32 -inline this code triggers an Access Violation:

```D
void vecdiff(ref double[4] a, ref double[4] b, ref double[4] result)
{
    result[0] = a[0] - b[0];
    result[1] = a[1] - b[1];
    result[2] = a[2] - b[2];
    result[3] = a[3];
}

pragma(inline, false)
double norm(ref double[4] a) => 0;

pragma(inline, false)
void outerproduct(ref double[4] a, ref double[4] b, ref double[4] c) {}

pragma(inline, false)
double innerproduct(ref double[4] a, ref double[4] b) => 0;

pragma(inline, false)
void inlinebug(ref double[4] point1, ref double[4] point2, ref double[4]
point3, ref double[4] abcd)
{
    double[4] v1 = 0.0;
    double[4] v2 = 0.0;
    vecdiff(point1, point2, v1);
    vecdiff(point2, point3, v2);

    outerproduct(v1, v2, abcd);
    if (norm(abcd) > 0.0)
    {
        abcd[0] = innerproduct(abcd, point1);
    }
}

void main()
{
    double[4] a = 0.0;
    inlinebug(a, a, a, a);
}
```

Disassembly with -vasm:

```
_D5testi9inlinebugFKG4dKQeKQhKQkZv:
0000:   83 EC 48                 sub       ESP,048h
0003:   8B 54 24 50              mov       EDX,050h[ESP]
0007:   B9 08 00 00 00           mov       ECX,8
000c:   89 1C 24                 mov       [ESP],EBX
000f:   89 C3                    mov       EBX,EAX
0011:   31 C0                    xor       EAX,EAX
0013:   89 7C 24 04              mov       4[ESP],EDI
0017:   8D 7C 24 08              lea       EDI,8[ESP]
001b:   F3                       rep
001c:   AB                       stosd
001d:   8B 44 24 4C              mov       EAX,04Ch[ESP]
0021:   31 C0                    xor       EAX,EAX
0023:   8D 7C 24 28              lea       EDI,028h[ESP]
0027:   B9 08 00 00 00           mov       ECX,8
002c:   F3                       rep
002d:   AB                       stosd
002e:   8B 7C 24 54              mov       EDI,054h[ESP]
0032:   DD 07                    fnld      qword ptr [EDI]
0034:   DC 22                    fnsub     qword ptr [EDX]
0036:   DD 5C 24 08              fnstp     qword ptr 8[ESP]
003a:   DD 47 08                 fnld      qword ptr 8[EDI]
003d:   DC 62 08                 fnsub     qword ptr 8[EDX]
0040:   DD 5C 24 10              fnstp     qword ptr 010h[ESP]
0044:   DD 47 10                 fnld      qword ptr 010h[EDI]
0047:   DC 62 10                 fnsub     qword ptr 010h[EDX]
004a:   DD 5C 24 18              fnstp     qword ptr 018h[ESP]
004e:   DD 47 18                 fnld      qword ptr 018h[EDI]
0051:   DD 5C 24 20              fnstp     qword ptr 020h[ESP]
0055:   DD 02                    fnld      qword ptr [EDX]
0057:   DC 20                    fnsub     qword ptr [EAX] <= Access Violation
```

The EAX register is 0 at that point.

--


More information about the Digitalmars-d-bugs mailing list