libstdc++: Use __builtin_expect in __dynamic_cast
authorJonathan Wakely <jwakely@redhat.com>
Mon, 23 Aug 2021 12:12:24 +0000 (13:12 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Mon, 23 Aug 2021 13:45:00 +0000 (14:45 +0100)
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/libsupc++/dyncast.cc

index f8f707e..a1138d0 100644 (file)
@@ -47,9 +47,9 @@ __dynamic_cast (const void *src_ptr,    // object started from
                 const __class_type_info *dst_type, // desired target type
                 ptrdiff_t src2dst) // how src and dst are related
   {
-  if (!src_ptr)
-    /* Handle precondition violations gracefully.  */
-    return NULL;
+  if (__builtin_expect(!src_ptr, 0))
+    return NULL; // Handle precondition violations gracefully.
+
   const void *vtable = *static_cast <const void *const *> (src_ptr);
   const vtable_prefix *prefix =
     (adjust_pointer <vtable_prefix>
@@ -70,7 +70,7 @@ __dynamic_cast (const void *src_ptr,    // object started from
      (whole_vtable, -ptrdiff_t (offsetof (vtable_prefix, origin))));
   if (whole_prefix->whole_type != whole_type)
     return NULL;
-  
+
   whole_type->__do_dyncast (src2dst, __class_type_info::__contained_public,
                             dst_type, whole_ptr, src_type, src_ptr, result);
   if (!result.dst_ptr)