When doing Emscritpen EH, if SjLj is also enabled and used and if the
thrown exception has a possiblity being a longjmp instead of an
exception, we shouldn't swallow it; we should rethrow, or relay it. It
was done in D106525 and the code is here:
https://github.com/llvm/llvm-project/blob/8441a8eea8007b9eaaaabf76055949180a702d6d/llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp#L858-L898
Here is the pseudocode of that part: (copied from comments)
if (%__THREW__.val == 0 || %__THREW__.val == 1) goto %tail else goto %longjmp.rethrow longjmp.rethrow: ;; This is longjmp. Rethrow it %__threwValue.val = __threwValue emscripten_longjmp(%__THREW__.val, %__threwValue.val); tail: ;; Nothing happened or an exception is thrown ... Continue exception handling ...
If the current BB (where the invoke is created) has successors that
has the current BB as its PHI incoming node, now that has to change to
tail in the pseudocode, because tail is the latest BB that is
connected with the next BB, but this was missing.