On Tue, May 29, 2018 at 3:49 PM Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> wrote: > Putting this into herd would be extremely difficult, if not impossible, > because it involves analyzing code that was not executed. Does it? Can't we simplify the whole sequence as basically A if (!B) D for that "not B" case, and just think about that. IOW, let's ignore the whole "not executed" code. If B depends on A like you state, then that already implies that the write in D cannot come before the read of A. You fundamentally cannot do a conditional write before the read that the write condition depends on. So *any* write after a conditional is dependent on the read. So the existence of C - whether it has a barrier or not - is entirely immaterial at run-time. Now, the *compiler* can use the whole existence of that memory barrier in C to determine whether it can re-order the write to D or not, of course, but that's a separate issue, and then the whole "code that isn't executed" is not the issue any more. The compiler obviously sees all code, whether executing or not. Or am I being stupid and missing something entirely? That's possible. Linus