[Bug c++/87634] New: CSE for dynamic_cast

Simon.Richter at hogyros dot de gcc-bugzilla@gcc.gnu.org
Wed Oct 17 16:33:00 GMT 2018


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

            Bug ID: 87634
           Summary: CSE for dynamic_cast
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: Simon.Richter at hogyros dot de
  Target Milestone: ---

With the code

    struct A { virtual void foo() = 0; };

    struct B : A { virtual void foo() {} void bar() const; };

    void test(A *a)
    {
        if(auto b = dynamic_cast<B *>(a))
            b->bar();
        if(auto b = dynamic_cast<B *>(a))
            b->bar();
    }

I'd expect the type of the object to be unchanged between the two
`dynamic_cast` invocations, so the second type check would be unnecessary. The
generated code does two checks, however.

It is in theory possible to replace the object in-place with one of different
type if it is also accessible through a global pointer from within `B::bar()`,
but is this a good enough reason to repeat the type check, or would it be
possible to optimize out the second dynamic_cast<> here?


More information about the Gcc-bugs mailing list