> the implementation may assume any thread will eventually do one of the following: terminate, call a library I/O function, access a volatile glvalue, or perform a synchronization or atomic operation
Why is that rule needed? I could make my for loop try to solve the halting problem and it'll never finish either, circumventing that rule
So the compiler can merge two computation loops without proving termination.
Compute the Ackermann function, write the result, terminate.. when the sun goes red giant and swallows the earth.