digitalmars.D.bugs - [Issue 23048] New: [SIMD][CODEGEN] Inline XMM.LODUPD leads to wrong
- d-bugmail puremagic.com (67/67) Apr 23 2022 https://issues.dlang.org/show_bug.cgi?id=23048
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