Re: [RFC] LKMM: Add volatile_if()
From: Segher Boessenkool <hidden>
Date: 2021-06-04 16:57:22
Also in:
linux-arch, lkml
On Fri, Jun 04, 2021 at 06:37:22PM +0200, Peter Zijlstra wrote:
On Fri, Jun 04, 2021 at 09:30:01AM -0700, Linus Torvalds wrote:quoted
Why is "volatile_if()" not just #define barier_true() ({ barrier(); 1; }) #define volatile_if(x) if ((x) && barrier_true()) because that should essentially cause the same thing - the compiler should be *forced* to create one conditional branch (because "barrier" is an asm that can't be done on the false side, so it can't do it with arithmetic or other games), and after that we're done. No need for per-architecture "asm goto" games. No new memory barriers. No actual new code generation (except for the empty asm volatile that is a barrier).Because we weren't sure compilers weren't still allowed to optimize the branch away.
barrier_true is a volatile asm, so it should be executed on the real machine exactly as often as on the abstract machine (and in order with other side effects). And the && short-circuits, so you will always have the same effect as a branch. But there of course is nothing that forces there to be a branch (as a silly example, the compiler could convert some control flow to go via computed return addresses). Segher