This change speeds up the simple benchmark below by about 40%.
struct A { virtual ~A() {} };
struct B: A { } b;
A* ap = &b;
void *sink;
int main()
{
for (long i = 0; i < 4000000000L; ++i)
sink = dynamic_cast<B*>(ap);
}
libstdc++-v3/ChangeLog:
* libsupc++/dyncast.cc (__dynamic_cast): Avoid virtual function
call in simple success case.
The null pointer check is never needed for correct code, only to
gracefully handle undefined cases. Add __builtin_expect to be sure that
we don't pessimize the valid uses.
libstdc++-v3/ChangeLog:
* libsupc++/dyncast.cc (__dynamic_cast): Add __builtin_expect to
precondition check.
libstdc++-v3/ChangeLog:
PR c++/99074
* libsupc++/dyncast.cc (__dynamic_cast): Return null when
first argument is null.
gcc/testsuite/ChangeLog:
PR c++/99074
* g++.dg/warn/Wnonnull11.C: New test.
Although the code here is well formed, it doesn't show intent well.
The reason checkers trigger on this is that it is a cause of real
bugs. So, negate a ptrdiff_t instead.
* libsupc++/dyncast.cc (__dynamic_cast): Cast offsetof to
ptrdiff_t before negation, to show intent more clearly.