libstdc++: optional: Treat _M_engaged as false after destructor
Improves optimization and reduces uninitialized warnings for std::optional by assuming _M_engaged is false after destruction.
GCC’s optimizer sometimes failed to recognize that the _M_engaged flag in std::optional is false after its destructor runs, especially if the destructor involved external calls. This could lead to uninitialized warnings. This commit adds a __builtin_unreachable() call after the destructor if _M_engaged is still true, explicitly informing the optimizer that _M_engaged must be false post-destruction. This helps prevent spurious warnings and improves optimization. This fixes PR127005.
In Details
In libstdc++'s std::optional, the _M_engaged flag indicates whether the optional currently holds a value. The destructor (_M_destroy) is responsible for cleaning up the contained value if it exists. However, optimizer passes might not always deduce that _M_engaged becomes false after _M_destroy completes, particularly if _M_destroy calls out to external functions. This can result in the compiler issuing uninitialized variable warnings for _M_engaged in code paths that are logically unreachable. By adding if (_M_engaged) __builtin_unreachable(); after the destructor call within…
- std::optional
- A C++ standard library component that represents an object that may or may not contain a value. It is used to express optional values in a type-safe way.
- _M_engaged
- An internal flag used within libstdc++'s implementation of
std::optionalto track whether the optional object currently holds a value. - __builtin_unreachable
- A GCC intrinsic function that indicates to the compiler that the code path following this call will never be executed. This can help the optimizer eliminate code and avoid warnings.
- uninitialized warning
- A compiler warning issued when a variable is used before it has been assigned a value, which can lead to undefined behavior.