digitalmars.D.bugs - [Issue 21727] New: [ICE][SIMD] Windows-only DMD crash with SIMD +
- d-bugmail puremagic.com (55/55) Mar 17 2021 https://issues.dlang.org/show_bug.cgi?id=21727
https://issues.dlang.org/show_bug.cgi?id=21727 Issue ID: 21727 Summary: [ICE][SIMD] Windows-only DMD crash with SIMD + optimizations + inlining Product: D Version: D2 Hardware: x86_64 OS: Windows Status: NEW Severity: normal Priority: P1 Component: dmd Assignee: nobody puremagic.com Reporter: n8sh.secondary hotmail.com Possibly related to https://issues.dlang.org/show_bug.cgi?id=21676 but the compiler doesn't crash in the same place. Given the following code and compiler flags, DMD will crash calling `dmd.backend.cgxmm.xmmload(tym_t tym, bool aligned)` with the invalid argument `tym == TYucent`. The crash occurs on Windows from DMD 2.068--since pragma(inline, true) has been allowed--but appears not to happen on Linux. dmd -m64 -O -inline crash.d ---crash.d import core.simd; safe: struct Float4 { float4 mVector; pragma(inline, false) ref typeof(this) doubleInPlace() return { mVector = mVector + mVector; return this; } } pragma(inline, false) Float4 identity(Float4 a) { return a; } pragma(inline, true) Float4 twoTimes(const ref Float4 a) { return Float4(cast(float4) __simd(XMM.ADDPS, a.mVector, a.mVector)); } pragma(inline, false) Float4 fourTimes(const Float4 a) { auto x = identity(a); auto y = x.doubleInPlace(); // Crash in dmd.backend.cgxmm.xmmload. auto z = twoTimes(y); return z; } void main() { const c = fourTimes(Float4([5,7,11,13])); assert(c.mVector.array == [20, 28, 44, 52]); } --- --
Mar 17 2021