On Sun, Jun 06, 2021 at 11:04:49AM -0700, Linus Torvalds wrote:
if (READ_ONCE(a)) {
barrier();
WRITE_ONCE(b,1);
} else {
barrier();
WRITE_ONCE(b, 1);
}
and currently because gcc thinks "same exact code", it will actually
optimize this to (pseudo-asm):
LD A
"empty asm"
ST $1,B
which is very much NOT equivalent to
LD A
BEQ over
"empty asm"
ST $1,B
JMP join
over:
"empty asm"
ST $1,B
join:
and that's the whole point of the barriers.
You didn't use a barrier with these semantics though. There is nothing
in that code that guarantees a branch.
See, but it VIOLATES the semantics of the code.
The code violates your expectations of the code.
You can't join those two empty asm's (and then remove the branch),
because the semantics of the code really aren't the same any more if
you do. Truly.
You truly should have written a branch in tthe asm if you truly wanted
a branch instruction.
Segher