On Fri, 27 Sept 2024 at 10:53, Mathieu Desnoyers <mathieu.desnoy...@efficios.com> wrote: > > > (b) the value barrier needs to be on *both* values so that the order > > of the equality testing doesn't matter. > > If we use OPTIMIZER_HIDE_VAR() on both parameters, it indeed minimizes > the odds that someone get the order wrong, but it disallows using > ADDRESS_EQ() with a constant parameter
No it doesn't. This is trivial - just hide the source of the *comparison*, so that the compiler doesn't know what you are comparing, and can't use it to then replace one with the other: static __always_inline bool compare_ptr(const volatile void *a, const volatile void *b) { OPTIMIZER_HIDE_VAR(a); OPTIMIZER_HIDE_VAR(b); return a == b; } compares two arbitrary pointer values without allowing the compiler to then use the comparison result to use either of the original values as a replacement for the other. And yes, that "hide both" model will cause a bit more register pressure, because the compiler will now compare two values that it really thinks are potentially different from the originals. So you'll have two "useless" temporaries that contain the same values as the source pointers, but if that's the cost of having a comparison that the compiler can't see, that's fine. Making it a bit less obvious, you can hide just one of the variables - you don't actually need to hide both m(but for clarity, maybe you want to). Because even hiding the value one from the compiler will mean that it can't use the comparison to decide that the originals are equal, even if one of them is unhidden. No? Linus