The proposed definition closely follows the existing definition of convergence in LLVM IR, but using C++ terms to describe language constructs.
There is no undefined behaviour. For each situation, convergence is either fully specified or implementation-defined.
Two important limitations where LLVM IR requires convergence control tokens to correctly express the convergence specified here:
Some combinations of loops, continue and break statements have different convergence specified for the statements inside that region of code, but result in the same loops in LLVM IR, thus producing ambiguous convergence in LLVM IR.
When a divergent condition inside a loop contains a convergent call followed by a break statement, these statements are lexically inside the loop, but in LLVM IR, they are outside the corresponding CFG loop.
This introduces the -fconvergence-control flag that emits convergence control intrinsics which are then used as the convergencectrl operand bundle on convergent calls.
This also redefines the noconvergent attribute in Clang. The existing simple interpretation is that if a statement is marked noconvergent, then every asm call is treated as a non-convergent operation in the emitted LLVM IR.
The new semantics introduces a more powerful notion that a noconvergent statement may contain convergent operations, but the resulting convergence constraints are limited to the scope of that statement. As a whole the statement itself does not place any convergence constraints on the control flow reaching it. When emitting convergence tokens, this attribute results in a call to the anchor intrinsic that determines convergence within the statement.