www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 23048] New: [SIMD][CODEGEN] Inline XMM.LODUPD leads to wrong

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

          Issue ID: 23048
           Summary: [SIMD][CODEGEN] Inline XMM.LODUPD leads to wrong SIMD
                    content
           Product: D
           Version: D2
          Hardware: x86_64
                OS: All
            Status: NEW
          Severity: critical
          Priority: P1
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: aliloko gmail.com

Created attachment 1848
  --> https://issues.dlang.org/attachment.cgi?id=1848&action=edit
main source

Using DMD v2.100.0-beta.1-dirty,
consider the following program:


----------- main.d -------------

import core.stdc.stdio;
import core.simd;

double2 _mm_loadr_pd (const(double)* mem_addr)
{
    double2 a = *cast(double2*)(mem_addr);
    double2 r;
    r.ptr[0] = a.array[1];
    r.ptr[1] = a.array[0];
    return r;
}
unittest
{
    align(16) double[2] A = [56.0, -74.0];
    double2 R = _mm_loadr_pd(A.ptr);
}

double2 _mm_loadu_pd (const(double)* mem_addr)
{
    return cast(double2) __simd(XMM.LODUPD, *mem_addr);    
}

unittest
{
    double[2] A = [56.0, -75.0];
    double2 R = _mm_loadu_pd(A.ptr);
    printf("%f %f\n", R[0], R[1]);
    double[2] correct = [56.0, -75.0];
    assert(R.array == correct);    
}

void main()
{
}

--------------------------------

To reproduce:
   $ dmd -m64 -inline -O main.d -unittest
   $ main.exe


This outputs:
   56.000000 -74.000000
   main.d(29): [unittest] unittest failure
   1/1 modules FAILED unittests

instead of the normal:
   56.000000 -75.000000
   1 modules passed unittests


Notes:
   - -O, -inline, and -unittest are necessary.
   - _mm_loadu_pd  is inline into the unittest
   - the 1st unittest is necessary, what happens seems to be that a former
variable or register is reused

--
Apr 23 2022