[PATCH] D96970: [WebAssembly] Handle multiple EH_LABELs in EH pad
Heejin Ahn via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 18 09:24:51 PST 2021
aheejin created this revision.
aheejin added reviewers: tlively, dschuff.
Herald added subscribers: wingo, ecnelises, sunfish, hiraditya, jgravelle-google, sbc100.
aheejin requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
Usually `EH_LABEL`s are placed in
- Before an `invoke` (which becomes calls in the backend)
- After an `invoke`
- At the start of an EH pad
I don't know exactly why, but I noticed there are cases of multiple, not
a single, `EH_LABEL` instructions in the beginning of an EH pad. In that
case `global.set` instruction placed to restore `__stack_pointer` ended
up between two `EH_LABEL` instructions before `CATCH`. It should follow
after the `EH_LABEL`s and `CATCH`. This CL fixes that case.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D96970
Files:
llvm/lib/Target/WebAssembly/WebAssemblyLateEHPrepare.cpp
llvm/test/CodeGen/WebAssembly/exception.mir
Index: llvm/test/CodeGen/WebAssembly/exception.mir
===================================================================
--- llvm/test/CodeGen/WebAssembly/exception.mir
+++ llvm/test/CodeGen/WebAssembly/exception.mir
@@ -24,6 +24,8 @@
name: eh_label_test
liveins:
- { reg: '$arguments' }
+frameInfo:
+ hasCalls: true
body: |
bb.0:
; TRY should be before EH_LABEL wrappers of throwing calls
@@ -41,10 +43,15 @@
bb.1 (landing-pad):
; predecessors: %bb.0
successors: %bb.2
- ; CATCH_ALL should be after an EH_LABEL at the beginning of an EH pad
+ ; CATCH_ALL should be after EH_LABELs in the beginning of an EH pad.
+ ; (Sometimes there are multiple EH_LABELs in an EH pad. This test tests
+ ; that.) GLOBAL_SET should follow right after that.
; CHECK: bb.1
; CHECK: EH_LABEL
+ ; CHECK: EH_LABEL
; CHECK-NEXT: CATCH_ALL
+ ; CHECK-NEXT: GLOBAL_SET_I32
+ EH_LABEL <mcsymbol .Ltmp2>
EH_LABEL <mcsymbol .Ltmp2>
CATCHRET %bb.2, %bb.1, implicit-def dead $arguments
Index: llvm/lib/Target/WebAssembly/WebAssemblyLateEHPrepare.cpp
===================================================================
--- llvm/lib/Target/WebAssembly/WebAssemblyLateEHPrepare.cpp
+++ llvm/lib/Target/WebAssembly/WebAssemblyLateEHPrepare.cpp
@@ -212,7 +212,7 @@
while (InsertPos != MBB.end() && InsertPos->isEHLabel())
InsertPos++;
// This runs after hoistCatches(), so we assume that if there is a catch,
- // that should be the non-EH label first instruction in an EH pad.
+ // that should be the first non-EH-label instruction in an EH pad.
if (InsertPos == MBB.end() ||
!WebAssembly::isCatch(InsertPos->getOpcode())) {
Changed = true;
@@ -383,10 +383,13 @@
// with leaf functions, and we don't restore __stack_pointer in leaf
// functions anyway.
auto InsertPos = MBB.begin();
- if (InsertPos->isEHLabel()) // EH pad starts with an EH label
- ++InsertPos;
- if (WebAssembly::isCatch(InsertPos->getOpcode()))
- ++InsertPos;
+ // Skip EH_LABELs in the beginning of an EH pad if present.
+ while (InsertPos != MBB.end() && InsertPos->isEHLabel())
+ InsertPos++;
+ assert(InsertPos != MBB.end() &&
+ WebAssembly::isCatch(InsertPos->getOpcode()) &&
+ "catch/catch_all should be present in every EH pad at this point");
+ ++InsertPos; // Skip the catch instruction
FrameLowering->writeSPToGlobal(FrameLowering->getSPReg(MF), MF, MBB,
InsertPos, MBB.begin()->getDebugLoc());
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D96970.324678.patch
Type: text/x-patch
Size: 2585 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210218/a44cf6d6/attachment.bin>
More information about the llvm-commits
mailing list