Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> wrote: > 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. I have just been thinking about how to word this patch; am I correct in assuming that the LKMM does not deal with loop conditions? Or in other words, there is no way for a loop condition to impose a ctrl dependency on any WRITE_ONCE's in the loop body? It are only if and switch statements the LKMM is concerned with in the case of ctrl dependencies? Many thanks, Paul >> 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