Skip to content

Commit

Permalink
[WebAssembly] Fix PHI when relaying longjmps
Browse files Browse the repository at this point in the history
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.

Reviewed By: tlively

Differential Revision: https://reviews.llvm.org/D108785
  • Loading branch information
aheejin committed Aug 27, 2021
1 parent 3784fc4 commit f5cff29
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -891,6 +891,7 @@ bool WebAssemblyLowerEmscriptenEHSjLj::runEHOnFunction(Function &F) {

IRB.CreateUnreachable();
IRB.SetInsertPoint(Tail);
BB.replaceSuccessorsPhiUsesWith(&BB, Tail);
}

// Insert a branch based on __THREW__ variable
Expand Down
5 changes: 5 additions & 0 deletions llvm/test/CodeGen/WebAssembly/lower-em-ehsjlj.ll
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,10 @@ entry:
; CHECK-NEXT: %or = or i1 %cmp.eq.zero, %cmp.eq.one
; CHECK-NEXT: br i1 %or, label %tail, label %longjmp.rethrow

; CHECK: try.cont:
; CHECK-NEXT: %phi = phi i32 [ undef, %tail ], [ undef, %lpad ]
; CHECK-NEXT: ret void

; CHECK: tail:
; CHECK-NEXT: %cmp = icmp eq i32 %__THREW__.val, 1
; CHECK-NEXT: br i1 %cmp, label %lpad, label %try.cont
Expand All @@ -84,6 +88,7 @@ lpad: ; preds = %entry
br label %try.cont

try.cont: ; preds = %entry, %lpad
%phi = phi i32 [ undef, %entry ], [ undef, %lpad ]
ret void
}

Expand Down

0 comments on commit f5cff29

Please sign in to comment.