[llvm] f3f0d99 - Revert "[WebAssembly] Fix phi handling for Wasm SjLj (#99730)"
Heejin Ahn via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 23 17:15:22 PDT 2024
Author: Heejin Ahn
Date: 2024-07-24T00:14:58Z
New Revision: f3f0d9928f982cfd302351f418bcc5b63cc1bb9d
URL: https://github.com/llvm/llvm-project/commit/f3f0d9928f982cfd302351f418bcc5b63cc1bb9d
DIFF: https://github.com/llvm/llvm-project/commit/f3f0d9928f982cfd302351f418bcc5b63cc1bb9d.diff
LOG: Revert "[WebAssembly] Fix phi handling for Wasm SjLj (#99730)"
This reverts commit 2bf71b8bc851b49745b795f228037db159005570.
This broke the builbot at
https://lab.llvm.org/buildbot/#/builders/110/builds/474.
Added:
Modified:
llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp
Removed:
llvm/test/CodeGen/WebAssembly/lower-wasm-ehsjlj-phi.ll
################################################################################
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp
index 9e97f6b38d0e1..7cc030460e30f 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp
@@ -777,8 +777,6 @@ void WebAssemblyLowerEmscriptenEHSjLj::rebuildSSA(Function &F) {
SSAUpdaterBulk SSA;
for (BasicBlock &BB : F) {
for (Instruction &I : BB) {
- if (I.getType()->isVoidTy())
- continue;
unsigned VarID = SSA.AddVariable(I.getName(), I.getType());
// If a value is defined by an invoke instruction, it is only available in
// its normal destination and not in its unwind destination.
@@ -1689,8 +1687,6 @@ void WebAssemblyLowerEmscriptenEHSjLj::handleLongjmpableCallsForWasmSjLj(
}
}
- SmallDenseMap<BasicBlock *, SmallPtrSet<BasicBlock *, 4>, 4>
- UnwindDestToNewPreds;
for (auto *CI : LongjmpableCalls) {
// Even if the callee function has attribute 'nounwind', which is true for
// all C functions, it can longjmp, which means it can throw a Wasm
@@ -1728,11 +1724,6 @@ void WebAssemblyLowerEmscriptenEHSjLj::handleLongjmpableCallsForWasmSjLj(
}
if (!UnwindDest)
UnwindDest = CatchDispatchLongjmpBB;
- // Because we are changing a longjmpable call to an invoke, its unwind
- // destination can be an existing EH pad that already have phis, and the BB
- // with the newly created invoke will become a new predecessor of that EH
- // pad. In this case we need to add the new predecessor to those phis.
- UnwindDestToNewPreds[UnwindDest].insert(CI->getParent());
changeToInvokeAndSplitBasicBlock(CI, UnwindDest);
}
@@ -1761,45 +1752,4 @@ void WebAssemblyLowerEmscriptenEHSjLj::handleLongjmpableCallsForWasmSjLj(
for (Instruction *I : ToErase)
I->eraseFromParent();
-
- // Add entries for new predecessors to phis in unwind destinations. We use
- // 'undef' as a placeholder value. We should make sure the phis have a valid
- // set of predecessors before running SSAUpdater, because SSAUpdater
- // internally can use existing phis to gather predecessor info rather than
- // scanning the actual CFG (See FindPredecessorBlocks in SSAUpdater.cpp for
- // details).
- for (auto &[UnwindDest, NewPreds] : UnwindDestToNewPreds) {
- for (PHINode &PN : UnwindDest->phis()) {
- for (auto *NewPred : NewPreds) {
- assert(PN.getBasicBlockIndex(NewPred) == -1);
- PN.addIncoming(UndefValue::get(PN.getType()), NewPred);
- }
- }
- }
-
- // For unwind destinations for newly added invokes to longjmpable functions,
- // calculate incoming values for the newly added predecessors using
- // SSAUpdater. We add existing values in the phis to SSAUpdater as available
- // values and let it calculate what the value should be at the end of new
- // incoming blocks.
- for (auto &[UnwindDest, NewPreds] : UnwindDestToNewPreds) {
- for (PHINode &PN : UnwindDest->phis()) {
- SSAUpdater SSA;
- SSA.Initialize(PN.getType(), PN.getName());
- for (unsigned Idx = 0, E = PN.getNumIncomingValues(); Idx != E; ++Idx) {
- if (NewPreds.contains(PN.getIncomingBlock(Idx)))
- continue;
- Value *V = PN.getIncomingValue(Idx);
- if (auto *II = dyn_cast<InvokeInst>(V))
- SSA.AddAvailableValue(II->getNormalDest(), II);
- else if (auto *I = dyn_cast<Instruction>(V))
- SSA.AddAvailableValue(I->getParent(), I);
- else
- SSA.AddAvailableValue(PN.getIncomingBlock(Idx), V);
- }
- for (auto *NewPred : NewPreds)
- PN.setIncomingValueForBlock(NewPred, SSA.GetValueAtEndOfBlock(NewPred));
- assert(PN.isComplete());
- }
- }
}
diff --git a/llvm/test/CodeGen/WebAssembly/lower-wasm-ehsjlj-phi.ll b/llvm/test/CodeGen/WebAssembly/lower-wasm-ehsjlj-phi.ll
deleted file mode 100644
index 97f6d797a63bd..0000000000000
--- a/llvm/test/CodeGen/WebAssembly/lower-wasm-ehsjlj-phi.ll
+++ /dev/null
@@ -1,126 +0,0 @@
-; RUN: opt < %s -wasm-lower-em-ehsjlj -wasm-enable-eh -wasm-enable-sjlj -S | FileCheck %s
-
-target triple = "wasm32-unknown-emscripten"
-
-%struct.__jmp_buf_tag = type { [6 x i32], i32, [32 x i32] }
- at buf = internal global [1 x %struct.__jmp_buf_tag] zeroinitializer, align 16
-
-; When longjmpable calls are coverted into invokes in Wasm SjLj transformation
-; and their unwind destination is an existing catchpad or cleanuppad due to
-; maintain the scope structure, the new pred BBs created by invokes and the
-; correct incoming values should be added the existing phis in those unwind
-; destinations.
-
-; When longjmpable calls are within a cleanuppad.
-define void @longjmpable_invoke_phi0() personality ptr @__gxx_wasm_personality_v0 {
-; CHECK-LABEL: @longjmpable_invoke_phi0
-entry:
- %val.entry = call i32 @llvm.wasm.memory.size.i32(i32 0)
- %0 = call i32 @setjmp(ptr @buf) #2
- invoke void @foo()
- to label %bb1 unwind label %ehcleanup1
-
-bb1: ; preds = %entry
- ; We use llvm.wasm.memory.size intrinsic just to get/use an i32 value. The
- ; reason we use an intrinsic here is to make it not longjmpable. If this can
- ; longjmp, the result will be more complicated and hard to check.
- %val.bb1 = call i32 @llvm.wasm.memory.size.i32(i32 0)
- invoke void @foo()
- to label %bb2 unwind label %ehcleanup0
-
-bb2: ; preds = %bb1
- unreachable
-
-ehcleanup0: ; preds = %bb1
- %1 = cleanuppad within none []
- call void @longjmpable() [ "funclet"(token %1) ]
-; CHECK: ehcleanup0
-; CHECK: invoke void @longjmpable
-; CHECK-NEXT: to label %.noexc unwind label %ehcleanup1
- invoke void @foo() [ "funclet"(token %1) ]
- to label %bb3 unwind label %ehcleanup1
-
-bb3: ; preds = %ehcleanup0
- %val.bb3 = call i32 @llvm.wasm.memory.size.i32(i32 0)
- call void @longjmpable() [ "funclet"(token %1) ]
-; CHECK: bb3:
-; CHECK: invoke void @longjmpable
-; CHECK-NEXT: to label %.noexc1 unwind label %ehcleanup1
- cleanupret from %1 unwind label %ehcleanup1
-
-ehcleanup1: ; preds = %bb3, %ehcleanup0, %entry
- %phi = phi i32 [ %val.entry, %entry ], [ %val.bb1, %ehcleanup0 ], [ %val.bb3, %bb3 ]
-; CHECK: ehcleanup1:
-; CHECK-NEXT: %phi = phi i32 [ %val.entry2, %entry.split.split ], [ %val.bb1, %.noexc ], [ %val.bb3, %.noexc1 ], [ %val.bb1, %ehcleanup0 ], [ %val.bb3, %bb3 ]
- %2 = cleanuppad within none []
- %3 = call i32 @llvm.wasm.memory.size.i32(i32 %phi)
- cleanupret from %2 unwind to caller
-}
-
-; When longjmpable calls are within a catchpad.
-define void @longjmpable_invoke_phi1() personality ptr @__gxx_wasm_personality_v0 {
-; CHECK-LABEL: @longjmpable_invoke_phi1
-entry:
- %val.entry = call i32 @llvm.wasm.memory.size.i32(i32 0)
- %0 = call i32 @setjmp(ptr @buf) #2
- invoke void @foo()
- to label %bb1 unwind label %ehcleanup
-
-bb1: ; preds = %entry
- %val.bb1 = call i32 @llvm.wasm.memory.size.i32(i32 0)
- invoke void @foo()
- to label %bb2 unwind label %catch.dispatch
-
-bb2: ; preds = %bb1
- unreachable
-
-catch.dispatch: ; preds = %bb1
- %1 = catchswitch within none [label %catch.start] unwind label %ehcleanup
-
-catch.start: ; preds = %catch.dispatch
- %2 = catchpad within %1 [ptr null]
- %3 = call ptr @llvm.wasm.get.exception(token %2)
- %4 = call i32 @llvm.wasm.get.ehselector(token %2)
- call void @longjmpable() [ "funclet"(token %2) ]
-; CHECK: catch.start:
-; CHECK: invoke void @longjmpable
-; CHECK-NEXT: to label %.noexc unwind label %ehcleanup
- invoke void @foo() [ "funclet"(token %2) ]
- to label %bb3 unwind label %ehcleanup
-
-bb3: ; preds = %catch.start
- %val.bb3 = call i32 @llvm.wasm.memory.size.i32(i32 0)
- call void @longjmpable() [ "funclet"(token %2) ]
-; CHECK: bb3:
-; CHECK: invoke void @longjmpable
-; CHECK-NEXT: to label %.noexc1 unwind label %ehcleanup
- invoke void @foo() [ "funclet"(token %2) ]
- to label %bb4 unwind label %ehcleanup
-
-bb4: ; preds = %bb3
- unreachable
-
-ehcleanup: ; preds = %bb3, %catch.start, %catch.dispatch, %entry
- %phi = phi i32 [ %val.entry, %entry ], [ %val.bb1, %catch.dispatch ], [ %val.bb1, %catch.start ], [ %val.bb3, %bb3 ]
-; CHECK: ehcleanup:
-; CHECK-NEXT: %phi = phi i32 [ %val.entry2, %entry.split.split ], [ %val.bb1, %catch.dispatch ], [ %val.bb1, %.noexc ], [ %val.bb3, %.noexc1 ], [ %val.bb1, %catch.start ], [ %val.bb3, %bb3 ]
- %5 = cleanuppad within none []
- %6 = call i32 @llvm.wasm.memory.size.i32(i32 %phi)
- cleanupret from %5 unwind to caller
-}
-
-declare i32 @setjmp(ptr)
-declare i32 @__gxx_wasm_personality_v0(...)
-declare void @foo()
-declare void @longjmpable()
-declare void @use_i32(i32)
-; Function Attrs: nocallback nofree nosync nounwind willreturn
-declare i32 @llvm.wasm.get.ehselector(token) #0
-; Function Attrs: nocallback nofree nosync nounwind willreturn
-declare ptr @llvm.wasm.get.exception(token) #0
-; Function Attrs: nocallback nofree nosync nounwind willreturn memory(read)
-declare i32 @llvm.wasm.memory.size.i32(i32) #1
-
-attributes #0 = { nocallback nofree nosync nounwind willreturn }
-attributes #1 = { nocallback nofree nosync nounwind willreturn memory(read) }
-attributes #2 = { returns_twice }
More information about the llvm-commits
mailing list