On 11/01/2022 08:11, Richard Biener via Gcc wrote: > On Mon, Jan 10, 2022 at 6:36 PM Martin Uecker <ma.uec...@gmail.com> wrote: >>
<snip> > > I realize that UB in a + b isn't (usually) observable but > UB resulting in traps are. > > So I'm still wondering why you think that 'volatile' makes > a critical difference we ought to honor? I don't remember > 'volatile' being special in the definition of the abstract > machine with regarding to observability (as opposed to > sequence points). > > Actually, volatile accesses /are/ critical to observable behaviour - observable behaviour is program start and termination (normal termination flushing file buffers, not crashes which are UB), input and output via "interactive devices" (these are not defined by the standard), and volatile accesses. (See 5.1.2.3p6 in the standards if you want the details. Note that in C18, "volatile access" was expanded to include all accesses through volatile-qualified lvalues.) However, undefined behaviour is /not/ observable behaviour. It can also be viewed as not affecting anything else, and so moving it does not affect volatile accesses. So you can't re-order two volatile accesses with respect to each other. But you /can/ re-order UB with respect to anything else, including volatile accesses. (IMHO) "Performing a trap" - such as some systems will do when dividing by 0, for example - is not listed as observable behaviour. <snip>