[Issue 14480] New: dmd 2.067 x64 release codegen

via Digitalmars-d-bugs digitalmars-d-bugs at puremagic.com
Wed Apr 22 03:22:24 PDT 2015


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

          Issue ID: 14480
           Summary: dmd 2.067 x64 release codegen
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Windows
            Status: NEW
          Severity: normal
          Priority: P1
         Component: DMD
          Assignee: nobody at puremagic.com
          Reporter: fengli at gmail.com

Created attachment 1515
  --> https://issues.dlang.org/attachment.cgi?id=1515&action=edit
bad rendering

Something very weird happened to my 2D vector graphics library since upgrading
to 2.067. I'm not 100% sure but it looks more like a codegen issue than a
program error. This is because both 32 bit debug and release builds are good,
64 bit debug build is good, but 64 bit release build is broken.

good rendering
https://onedrive.live.com/redir?resid=FDD337136ADE2BCF!11348&authkey=!AHIhJQXNT77Ewg8&v=3&ithint=photo%2cpng

bad rendering
https://onedrive.live.com/redir?resid=FDD337136ADE2BCF!11349&authkey=!ALVOTsEIN6qFvJs&v=3&ithint=photo%2cpng

I tracked down this issue to the bezier curve division routine:

    void bezier(T)(in T p1, in T p2, in T p3, in T p4)
    {
        auto p12   = (p1 + p2) / 2;
        auto p23   = (p2 + p3) / 2;
        auto p34   = (p3 + p4) / 2;
        auto p123  = (p12 + p23) / 2;
        auto p234  = (p23 + p34) / 2;
        auto p1234 = (p123 + p234) / 2;

        auto d = p4-p1;
        auto d2 = fabs(((p2.x - p4.x) * d.y - (p2.y - p4.y) * d.x));
        auto d3 = fabs(((p3.x - p4.x) * d.y - (p3.y - p4.y) * d.x));

        if((d2 + d3)*(d2 + d3) < 0.25 * dot(d, d))
        {
            m_appender ~= [PathVertex(p1234, VertexAttr.LineTo)];
            return;
        }

        bezier(p1, p12, p123, p1234);
        bezier(p1234, p234, p34, p4);
    }

It's pretty straightforward, if the curve is flat enough then return, otherwise
divide the curve into 2 shorter curves.

Below is a trace of the recursive division of one of the curves:

good:
[563.022, 319.849] [534.772, 266.534] [551.44, 365.862] [551.44, 365.862]
  [563.022, 319.849] [548.897, 293.192] [546.001, 304.695] [546.637, 322.862]
    [563.022, 319.849] [555.96, 306.52] [551.704, 302.732] [549.294, 304.546]
      [563.022, 319.849] [559.491, 313.185] [556.661, 308.905] [554.414,
306.519]
        [563.022, 319.849] [561.257, 316.517] [559.666, 313.781] [558.237,
311.58]
        [558.237, 311.58] [556.807, 309.379] [555.538, 307.712] [554.414,
306.519]
...

bad:
[563.022, 319.849] [534.772, 266.534] [551.44, 365.862] [551.44, 365.862]
  [563.022, 319.849] [548.897, 293.192] [546.001, 304.695] [546.637, 322.862]
    [563.022, 319.849] [555.96, 306.52] [551.704, 302.732] [549.294, 304.546]
      [563.022, 319.849] [559.491, 313.185] [556.661, 308.905] [554.414,
306.519]
        [563.022, 319.849] [561.257, 316.517] [559.666, 313.781] [558.237,
311.58]
        [558.237, 311.58] [556.807, 309.379] [555.538, 307.712] [9.0195e-318,
9.02709e-318]  <-- WTF?
...

As you can see the last point becomes a very small number. Consider this is the
'p4' argument which is not calculated but directly passed down, how can this
be?

If you want to see the full code, here it is
https://github.com/finalpatch/dagger

And the broken program is demo/svg

--


More information about the Digitalmars-d-bugs mailing list