https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67809
--- Comment #10 from Marc Glisse <glisse at gcc dot gnu.org> --- "Forward progress [intro.progress] The implementation may assume that any thread will eventually do one of the following: (1.1) — terminate, (1.2) — make a call to a library I/O function, (1.3) — perform an access through a volatile glvalue, or (1.4) — perform a synchronization operation or an atomic operation. [Note: This is intended to allow compiler transformations such as removal of empty loops, even when termination cannot be proven. — end note]"