[Issue 9320] New: Non-POD status of a struct correlated to bad inlining.

d-bugmail at puremagic.com d-bugmail at puremagic.com
Mon Jan 14 14:08:35 PST 2013


http://d.puremagic.com/issues/show_bug.cgi?id=9320

           Summary: Non-POD status of a struct correlated to bad inlining.
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody at puremagic.com
        ReportedBy: dransic at gmail.com


--- Comment #0 from Nicolas Sicard <dransic at gmail.com> 2013-01-14 14:08:34 PST ---
This codes defines a struct that is just a wrapper around a real x, with binary
operators.
---
struct Foo {
    real x;

    version(Constructor) {
        this(real x) {
            this.x = x;
        }
    }

    Foo opBinary(string op)(Foo other) {
        return Foo(mixin("x" ~ op ~ "other.x"));
    }
}

version(Constructor)
    static assert(!__traits(isPOD, Foo));
else
    static assert(__traits(isPOD, Foo));

Foo test(Foo a, Foo b, Foo c) {
    return (a + b) / (a * b) - c;
}

void main() {}
---

When compiled with -O -inline -release, the object code for the test function
is:
---
        push    RBP
        mov    RBP,RSP
        sub    RSP,010h
        fld    tbyte ptr 030h[RBP]
        fld    tbyte ptr 020h[RBP]
        faddp    ST(1),ST
        fld    tbyte ptr 030h[RBP]
        fld    tbyte ptr 020h[RBP]
        fmulp    ST(1),ST
        fdivp    ST(1),ST
        fld    tbyte ptr 010h[RBP]
        fsubp    ST(1),ST
        fstp    tbyte ptr [RDI]
        mov    word ptr 0Ah[RDI],0
        mov    dword ptr 0Ch[RDI],0
        mov    RAX,RDI
        mov    RSP,RBP
        pop    RBP
        ret
---

When compiled with the same flags, but with -version=Constructor, I benchmarked
the code as 5x slower (no data here) and the object code becomes:
---
        push    RBP
        mov    RBP,RSP
        sub    RSP,0D0h
        mov    -010h[RBP],RDI
        lea    RSI,020h[RBP]
        lea    RDI,-0A0h[RBP]
        movsd
        movsd
        mov    RSI,[00h][RIP]
        lea    RDI,-090h[RBP]
        movsd
        movsd
        fld    tbyte ptr 030h[RBP]
        fld    tbyte ptr -0A0h[RBP]
        faddp    ST(1),ST
        fstp    tbyte ptr -090h[RBP]
        mov    word ptr -086h[RBP],0
        mov    dword ptr -084h[RBP],0
        lea    RSI,-090h[RBP]
        lea    RDI,-0B0h[RBP]
        movsd
        movsd
        lea    RSI,020h[RBP]
        lea    RDI,-060h[RBP]
        movsd
        movsd
        mov    RSI,[00h][RIP]
        lea    RDI,-050h[RBP]
        movsd
        movsd
        fld    tbyte ptr 030h[RBP]
        fld    tbyte ptr -060h[RBP]
        fmulp    ST(1),ST
        fstp    tbyte ptr -050h[RBP]
        mov    word ptr -046h[RBP],0
        mov    dword ptr -044h[RBP],0
        lea    RSI,-050h[RBP]
        lea    RDI,-070h[RBP]
        movsd
        movsd
        lea    RSI,-070h[RBP]
        lea    RDI,-080h[RBP]
        movsd
        movsd
        mov    RSI,[00h][RIP]
        lea    RDI,-040h[RBP]
        movsd
        movsd
        fld    tbyte ptr -0B0h[RBP]
        fld    tbyte ptr -080h[RBP]
        fdivp    ST(1),ST
        fstp    tbyte ptr -040h[RBP]
        mov    word ptr -036h[RBP],0
        mov    dword ptr -034h[RBP],0
        lea    RSI,-040h[RBP]
        lea    RDI,-0C0h[RBP]
        movsd
        movsd
        lea    RSI,010h[RBP]
        lea    RDI,-030h[RBP]
        movsd
        movsd
        mov    RSI,[00h][RIP]
        lea    RDI,-020h[RBP]
        movsd
        movsd
        fld    tbyte ptr -0C0h[RBP]
        fld    tbyte ptr -030h[RBP]
        fsubp    ST(1),ST
        fstp    tbyte ptr -020h[RBP]
        mov    word ptr -016h[RBP],0
        mov    dword ptr -014h[RBP],0
        lea    RSI,-020h[RBP]
        lea    RDI,-0D0h[RBP]
        movsd
        movsd
        lea    RSI,-0D0h[RBP]
        mov    RDI,-010h[RBP]
        movsd
        movsd
        mov    RAX,-010h[RBP]
        mov    RSP,RBP
        pop    RBP
        ret
---

D2.061, OSX 10.8.2

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list