June 04, 2014
https://issues.dlang.org/show_bug.cgi?id=12852

          Issue ID: 12852
           Summary: 64 bit wrong code generated
           Product: D
           Version: D2
          Hardware: x86_64
                OS: All
            Status: NEW
          Severity: critical
          Priority: P1
         Component: DMD
          Assignee: nobody@puremagic.com
          Reporter: bugzilla@digitalmars.com

Martin Nowak reports https://github.com/D-Programming-Language/dmd/pull/2561 :


Here is a reduced test case for the std.numeric failure.

bool normalize(double[] range, double sum = 1)
{
    double s = 0;
    // Step 1: Compute sum and length of the range
    const length = range.length;
    foreach (e; range)
    {
        s += e;
    }
    // Step 2: perform normalization
    if (s == 0)
    {
        return false;
    }
    // The path most traveled
    return true;
}


This generate wrong code for  s == 0 . It reuses  rdx  where it previously loaded the content of the  xmm  register from the stack. You can compare the old (at line 35) and the new (at line 32) dissassembly.

If I remove the  SFLexit  flag from rtlsym.h it works, this seems to have some side-effect on the backend register usage.

--