https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113280
--- Comment #7 from David Brown <david at westcontrol dot com> --- Yes, the goal is an optimisation barrier with the least possible impact on the code. For most uses, asm("" : "+g" (x)) has been ideal, as far as I have tested. Typically it ensures "x" is evaluated in a register before the assembly "executes", and uses that register for "x" afterwards. But "g" also matches memory, so if "x" happens to be in a stack slot, it gets left there - there is no extra movement in and out of a register. But "g" does not match floating point or SIMD registers. So if "x" is in one of these registers, extra moves are generated, and I'd like to avoid them. So the ideal constraint would be one that matches memory or any register that can contain data. That's not quite the same as "match anything" - it should not match immediate values, nor "special" registers such as PC, SP, or a flags register, or the extra registers many processors have for floating point settings, link registers, interrupt state registers, and so on. But it might include registers for other accelerators that some chips have.