www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 14211] New: Compiler should devirtualize calls to members of

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

          Issue ID: 14211
           Summary: Compiler should devirtualize calls to members of final
                    class
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Windows
            Status: NEW
          Severity: enhancement
          Priority: P1
         Component: DMD
          Assignee: nobody puremagic.com
          Reporter: r.sagitario gmx.de

Compile with -m64 -inline -release -O:

class Mutex
{
    void lock() {}
}

final class GCMutex : Mutex
{
    //final override void lock() { super.lock(); }
}

void test()
{
    GCMutex gcLock = new GCMutex;
    gcLock.lock();
}

The disassembly for test() is:

_D4test4testFZv:
  0000000000000000: 55                 push        rbp
  0000000000000001: 48 8B EC           mov         rbp,rsp
  0000000000000004: 48 8D 0D 00 00 00  lea        
rcx,[_D4test7GCMutex7__ClassZ]
  000000000000000B: 48 83 EC 20        sub         rsp,20h
  000000000000000F: E8 00 00 00 00     call        _d_newclass
  0000000000000014: 48 83 C4 20        add         rsp,20h
  0000000000000018: 48 89 C1           mov         rcx,rax
  000000000000001B: 48 83 EC 20        sub         rsp,20h
  000000000000001F: 48 8B 01           mov         rax,qword ptr [rcx]
  0000000000000022: 48 FF 50 28        call        qword ptr [rax+28h]
  0000000000000026: 48 83 C4 20        add         rsp,20h
  000000000000002A: 5D                 pop         rbp
  000000000000002B: C3                 ret

I.e. the call to lock is still made through the virtual function table although
the class GCMutex is declared final.

If the commented code in GCMutex is enabled, the call is deviertualized, but
not inlined.

--
Feb 20 2015