On Mon, Jun 27, 2022 at 11:47:43AM +0200, Paul Heidekrüger wrote: > > > On 21. Jun 2022, at 16:24, Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> wrote: > > > > On Tue, Jun 21, 2022 at 01:59:27PM +0200, Paul Heidekrüger wrote: > >> OK. So, LKMM limits the scope of control dependencies to its arm(s), hence > >> there is a control dependency from the last READ_ONCE() before the loop > >> exists to the WRITE_ONCE(). > >> > >> But then what about the following: > >> > >>> int *x, *y; > >>> > >>> int foo() > >>> { > >>> /* More code */ > >>> > >>> if(READ_ONCE(x)) > >>> return 42; > >>> > >>> /* More code */ > >>> > >>> WRITE_ONCE(y, 42); > >>> > >>> /* More code */ > >>> > >>> return 0; > >>> } > >> > >> The READ_ONCE() determines whether the WRITE_ONCE() will be executed at all, > >> but the WRITE_ONCE() doesn't lie in the if condition's arm. > > > > So in this case the LKMM would not recognize that there's a control > > dependency, even though it clearly exists. > > Oh, that's unfortunate. > > Then I would still argue that the "at all" definition is misleading. This I agree, and I would welcome a patch improving the definition. Perhaps something along the lines of what I wrote earlier in this email thread. > time in the other direction as I had initially proposed though, as the above > example is a case where "at all" holds true, but LKMM doesn't cover it. Or > do you think that caveating this in litmus-tests.txt, e.g. via the patch we > had recently worked out [1], is enough? No, the explanation should be improved. Alan