*Probably a better word for that
*Probably a better word for that
The new feature is ASM GOTO. An ASM block is opaque to the compiler, and the compiler treats it similarly to a function call. A called function may contain control flow internal to itself, but can't cause control flow to happen in the caller. ASM GOTO is a new syntax for informing the compiler that this inline ASM may contain a GOTO to a given label. GCC added it around 4.5-ish, and LLVM is adding it in LLVM 9.
*FYI, the name for the thing that GOTO permits which combinations of if and loops doesn't is called "unstructured control flow".
Cons of asm goto: as parent points out, asm blocks are largely opaque to the compiler, which stands in the way of optimization. Control flow analysis can't take into account internal jumps, and for GCC at least, every asm goto block gets flagged as volatile. That disables whole classes of optimization.
Unless you're relying on hardware-specific instructions that the compiler doesn't know about or expose as an intrinsic, there's always an alternative to asm goto. That said, those alternatives might prove more expensive than the loss of optimizations precluded by the use of asm goto [2].
The pros/cons of including asm goto in clang were discussed in [3].
[1] https://lists.llvm.org/pipermail/llvm-dev/2017-April/111748....
[2] https://lwn.net/Articles/748074/
[3] http://lists.llvm.org/pipermail/llvm-dev/2018-October/127239...