https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63164

            Bug ID: 63164
           Summary: unnecessary calls to __dynamic_cast
           Product: gcc
           Version: 4.9.1
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: a...@cloudius-systems.com

The code

  struct A {
    virtual ~A() {}
  };

  struct B final : A {
    virtual ~B() {}
  };

  B* dc(A* a) {
    return dynamic_cast<B*>(a);
  }

compiles into the following assembly, which contains a call (jump) to
__dynamic_cast:

0000000000000000 <dc(A*)>:
   0:    48 85 ff                 test   %rdi,%rdi
   3:    74 1b                    je     20 <dc(A*)+0x20>
   5:    31 c9                    xor    %ecx,%ecx
   7:    ba 00 00 00 00           mov    $0x0,%edx
            8: R_X86_64_32    typeinfo for B
   c:    be 00 00 00 00           mov    $0x0,%esi
            d: R_X86_64_32    typeinfo for A
  11:    e9 00 00 00 00           jmpq   16 <dc(A*)+0x16>
            12: R_X86_64_PC32    __dynamic_cast-0x4
  16:    66 2e 0f 1f 84 00 00     nopw   %cs:0x0(%rax,%rax,1)
  1d:    00 00 00 
  20:    31 c0                    xor    %eax,%eax
  22:    c3                       retq   


However, since B is declared final, a simple compare of a's typeinfo with B's
would suffice.  This is a missed optimization opportunity.

Reply via email to