1d68904f9SJames Henderson //=== WebAssemblyExceptionInfoTest.cpp - WebAssemblyExceptionInfo unit tests =//
204c48949SHeejin Ahn //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
604c48949SHeejin Ahn //
704c48949SHeejin Ahn //===----------------------------------------------------------------------===//
804c48949SHeejin Ahn 
904c48949SHeejin Ahn #include "WebAssemblyExceptionInfo.h"
1004c48949SHeejin Ahn #include "llvm/CodeGen/MIRParser/MIRParser.h"
1104c48949SHeejin Ahn #include "llvm/CodeGen/MachineDominanceFrontier.h"
1204c48949SHeejin Ahn #include "llvm/CodeGen/MachineDominators.h"
1304c48949SHeejin Ahn #include "llvm/CodeGen/MachineModuleInfo.h"
14*89b57061SReid Kleckner #include "llvm/MC/TargetRegistry.h"
1504c48949SHeejin Ahn #include "llvm/Support/SourceMgr.h"
1604c48949SHeejin Ahn #include "llvm/Support/TargetSelect.h"
1704c48949SHeejin Ahn #include "llvm/Target/TargetMachine.h"
1804c48949SHeejin Ahn #include "gtest/gtest.h"
1904c48949SHeejin Ahn 
2004c48949SHeejin Ahn using namespace llvm;
2104c48949SHeejin Ahn 
2204c48949SHeejin Ahn namespace {
2304c48949SHeejin Ahn 
createTargetMachine()243d849f67SMatthias Braun std::unique_ptr<LLVMTargetMachine> createTargetMachine() {
2504c48949SHeejin Ahn   auto TT(Triple::normalize("wasm32-unknown-unknown"));
2604c48949SHeejin Ahn   std::string CPU("");
2704c48949SHeejin Ahn   std::string FS("");
2804c48949SHeejin Ahn 
2904c48949SHeejin Ahn   LLVMInitializeWebAssemblyTargetInfo();
3004c48949SHeejin Ahn   LLVMInitializeWebAssemblyTarget();
3104c48949SHeejin Ahn   LLVMInitializeWebAssemblyTargetMC();
3204c48949SHeejin Ahn 
3304c48949SHeejin Ahn   std::string Error;
3404c48949SHeejin Ahn   const Target *TheTarget = TargetRegistry::lookupTarget(TT, Error);
3504c48949SHeejin Ahn   assert(TheTarget);
3604c48949SHeejin Ahn 
373d849f67SMatthias Braun   return std::unique_ptr<LLVMTargetMachine>(static_cast<LLVMTargetMachine*>(
383d849f67SMatthias Braun       TheTarget->createTargetMachine(TT, CPU, FS, TargetOptions(), None, None,
393d849f67SMatthias Braun                                      CodeGenOpt::Default)));
4004c48949SHeejin Ahn }
4104c48949SHeejin Ahn 
parseMIR(LLVMContext & Context,std::unique_ptr<MIRParser> & MIR,const TargetMachine & TM,StringRef MIRCode,const char * FuncName,MachineModuleInfo & MMI)4204c48949SHeejin Ahn std::unique_ptr<Module> parseMIR(LLVMContext &Context,
4304c48949SHeejin Ahn                                  std::unique_ptr<MIRParser> &MIR,
4404c48949SHeejin Ahn                                  const TargetMachine &TM, StringRef MIRCode,
4504c48949SHeejin Ahn                                  const char *FuncName, MachineModuleInfo &MMI) {
4604c48949SHeejin Ahn   SMDiagnostic Diagnostic;
4704c48949SHeejin Ahn   std::unique_ptr<MemoryBuffer> MBuffer = MemoryBuffer::getMemBuffer(MIRCode);
4804c48949SHeejin Ahn   MIR = createMIRParser(std::move(MBuffer), Context);
4904c48949SHeejin Ahn   if (!MIR)
5004c48949SHeejin Ahn     return nullptr;
5104c48949SHeejin Ahn 
5204c48949SHeejin Ahn   std::unique_ptr<Module> M = MIR->parseIRModule();
5304c48949SHeejin Ahn   if (!M)
5404c48949SHeejin Ahn     return nullptr;
5504c48949SHeejin Ahn 
5604c48949SHeejin Ahn   M->setDataLayout(TM.createDataLayout());
5704c48949SHeejin Ahn 
5804c48949SHeejin Ahn   if (MIR->parseMachineFunctions(*M, MMI))
5904c48949SHeejin Ahn     return nullptr;
6004c48949SHeejin Ahn 
6104c48949SHeejin Ahn   return M;
6204c48949SHeejin Ahn }
6304c48949SHeejin Ahn 
6404c48949SHeejin Ahn } // namespace
6504c48949SHeejin Ahn 
TEST(WebAssemblyExceptionInfoTest,TEST0)6604c48949SHeejin Ahn TEST(WebAssemblyExceptionInfoTest, TEST0) {
673d849f67SMatthias Braun   std::unique_ptr<LLVMTargetMachine> TM = createTargetMachine();
6804c48949SHeejin Ahn   ASSERT_TRUE(TM);
6904c48949SHeejin Ahn 
7004c48949SHeejin Ahn   StringRef MIRString = R"MIR(
7104c48949SHeejin Ahn --- |
7204c48949SHeejin Ahn   target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
7304c48949SHeejin Ahn   target triple = "wasm32-unknown-unknown"
7404c48949SHeejin Ahn 
7504c48949SHeejin Ahn   declare i32 @__gxx_wasm_personality_v0(...)
7604c48949SHeejin Ahn 
77d6f48786SHeejin Ahn   define void @test0() personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) {
7804c48949SHeejin Ahn     unreachable
7904c48949SHeejin Ahn   }
8004c48949SHeejin Ahn 
8104c48949SHeejin Ahn ...
8204c48949SHeejin Ahn ---
8304c48949SHeejin Ahn name: test0
8404c48949SHeejin Ahn liveins:
8504c48949SHeejin Ahn   - { reg: '$arguments' }
8604c48949SHeejin Ahn   - { reg: '$value_stack' }
8704c48949SHeejin Ahn body: |
8804c48949SHeejin Ahn   bb.0:
8904c48949SHeejin Ahn     successors: %bb.1, %bb.2
9004c48949SHeejin Ahn     liveins: $arguments, $value_stack
9104c48949SHeejin Ahn     BR %bb.1, implicit-def dead $arguments
9204c48949SHeejin Ahn 
9304c48949SHeejin Ahn   bb.1:
9404c48949SHeejin Ahn   ; predecessors: %bb.0
9504c48949SHeejin Ahn     successors: %bb.7
9604c48949SHeejin Ahn     liveins: $value_stack
9704c48949SHeejin Ahn     BR %bb.7, implicit-def $arguments
9804c48949SHeejin Ahn 
9904c48949SHeejin Ahn   bb.2 (landing-pad):
10004c48949SHeejin Ahn   ; predecessors: %bb.0
10104c48949SHeejin Ahn     successors: %bb.3, %bb.9
10204c48949SHeejin Ahn     liveins: $value_stack
1039e4eadebSHeejin Ahn     CATCH_ALL implicit-def $arguments
1049e4eadebSHeejin Ahn     RETHROW 0, implicit-def dead $arguments
10504c48949SHeejin Ahn 
10604c48949SHeejin Ahn   bb.3 (landing-pad):
10704c48949SHeejin Ahn   ; predecessors: %bb.2
10804c48949SHeejin Ahn     successors: %bb.4, %bb.6
10904c48949SHeejin Ahn     liveins: $value_stack
1109e4eadebSHeejin Ahn     %1:i32 = CATCH &__cpp_exception, implicit-def $arguments
11104c48949SHeejin Ahn     BR_IF %bb.4, %58:i32, implicit-def $arguments, implicit-def $value_stack, implicit $value_stack
11204c48949SHeejin Ahn     BR %bb.6, implicit-def $arguments
11304c48949SHeejin Ahn 
11404c48949SHeejin Ahn   bb.4:
11504c48949SHeejin Ahn   ; predecessors: %bb.3
11604c48949SHeejin Ahn     successors: %bb.5, %bb.8
11704c48949SHeejin Ahn     liveins: $value_stack
11804c48949SHeejin Ahn     BR %bb.5, implicit-def dead $arguments
11904c48949SHeejin Ahn 
12004c48949SHeejin Ahn   bb.5:
12104c48949SHeejin Ahn   ; predecessors: %bb.4
12204c48949SHeejin Ahn     successors: %bb.7
12304c48949SHeejin Ahn     liveins: $value_stack
1249e4eadebSHeejin Ahn     BR %bb.7, implicit-def dead $arguments
12504c48949SHeejin Ahn 
12604c48949SHeejin Ahn   bb.6:
12704c48949SHeejin Ahn   ; predecessors: %bb.3
12804c48949SHeejin Ahn     successors: %bb.10, %bb.9
12904c48949SHeejin Ahn     liveins: $value_stack
13004c48949SHeejin Ahn     BR %bb.10, implicit-def dead $arguments
13104c48949SHeejin Ahn 
13204c48949SHeejin Ahn   bb.7:
13304c48949SHeejin Ahn   ; predecessors: %bb.5, %bb.1
13404c48949SHeejin Ahn     liveins: $value_stack
1353414bce0SThomas Lively     RETURN implicit-def $arguments
13604c48949SHeejin Ahn 
13704c48949SHeejin Ahn   bb.8 (landing-pad):
13804c48949SHeejin Ahn   ; predecessors: %bb.4
13904c48949SHeejin Ahn     successors: %bb.9
14004c48949SHeejin Ahn     liveins: $value_stack
1419e4eadebSHeejin Ahn     CATCH_ALL implicit-def $arguments
1429e4eadebSHeejin Ahn     RETHROW 0, implicit-def dead $arguments
14304c48949SHeejin Ahn 
14404c48949SHeejin Ahn   bb.9 (landing-pad):
14504c48949SHeejin Ahn   ; predecessors: %bb.2, %bb.6, %bb.8
14604c48949SHeejin Ahn     liveins: $value_stack
1479e4eadebSHeejin Ahn     CATCH_ALL implicit-def $arguments
1489e4eadebSHeejin Ahn     RETHROW 0, implicit-def dead $arguments
14904c48949SHeejin Ahn 
15004c48949SHeejin Ahn   bb.10:
15104c48949SHeejin Ahn   ; predecessors: %bb.6
15204c48949SHeejin Ahn     liveins: $value_stack
15304c48949SHeejin Ahn     UNREACHABLE implicit-def $arguments
15404c48949SHeejin Ahn )MIR";
15504c48949SHeejin Ahn 
15604c48949SHeejin Ahn   LLVMContext Context;
15704c48949SHeejin Ahn   std::unique_ptr<MIRParser> MIR;
15804c48949SHeejin Ahn   MachineModuleInfo MMI(TM.get());
15904c48949SHeejin Ahn   std::unique_ptr<Module> M =
16004c48949SHeejin Ahn       parseMIR(Context, MIR, *TM, MIRString, "test0", MMI);
16104c48949SHeejin Ahn   ASSERT_TRUE(M);
16204c48949SHeejin Ahn 
16304c48949SHeejin Ahn   Function *F = M->getFunction("test0");
16404c48949SHeejin Ahn   auto *MF = MMI.getMachineFunction(*F);
16504c48949SHeejin Ahn   ASSERT_TRUE(MF);
16604c48949SHeejin Ahn 
16704c48949SHeejin Ahn   WebAssemblyExceptionInfo WEI;
16804c48949SHeejin Ahn   MachineDominatorTree MDT;
16904c48949SHeejin Ahn   MachineDominanceFrontier MDF;
17004c48949SHeejin Ahn   MDT.runOnMachineFunction(*MF);
17104c48949SHeejin Ahn   MDF.getBase().analyze(MDT.getBase());
172ea8c6375SHeejin Ahn   WEI.recalculate(*MF, MDT, MDF);
17304c48949SHeejin Ahn 
17404c48949SHeejin Ahn   // Exception info structure:
17504c48949SHeejin Ahn   // |- bb2 (ehpad), bb3, bb4, bb5, bb6, bb8, bb9, bb10
17604c48949SHeejin Ahn   //   |- bb3 (ehpad), bb4, bb5, bb6, bb8, bb10
17704c48949SHeejin Ahn   //     |- bb8 (ehpad)
17804c48949SHeejin Ahn   //   |- bb9 (ehpad)
17904c48949SHeejin Ahn 
18004c48949SHeejin Ahn   auto *MBB2 = MF->getBlockNumbered(2);
18104c48949SHeejin Ahn   auto *WE0 = WEI.getExceptionFor(MBB2);
18204c48949SHeejin Ahn   ASSERT_TRUE(WE0);
18304c48949SHeejin Ahn   EXPECT_EQ(WE0->getEHPad(), MBB2);
18404c48949SHeejin Ahn   EXPECT_EQ(WE0->getParentException(), nullptr);
18504c48949SHeejin Ahn   EXPECT_EQ(WE0->getExceptionDepth(), (unsigned)1);
18604c48949SHeejin Ahn 
18704c48949SHeejin Ahn   auto *MBB3 = MF->getBlockNumbered(3);
18804c48949SHeejin Ahn   auto *WE0_0 = WEI.getExceptionFor(MBB3);
18904c48949SHeejin Ahn   ASSERT_TRUE(WE0_0);
19004c48949SHeejin Ahn   EXPECT_EQ(WE0_0->getEHPad(), MBB3);
19104c48949SHeejin Ahn   EXPECT_EQ(WE0_0->getParentException(), WE0);
19204c48949SHeejin Ahn   EXPECT_EQ(WE0_0->getExceptionDepth(), (unsigned)2);
19304c48949SHeejin Ahn 
19404c48949SHeejin Ahn   auto *MBB4 = MF->getBlockNumbered(4);
19504c48949SHeejin Ahn   WE0_0 = WEI.getExceptionFor(MBB4);
19604c48949SHeejin Ahn   ASSERT_TRUE(WE0_0);
19704c48949SHeejin Ahn   EXPECT_EQ(WE0_0->getEHPad(), MBB3);
19804c48949SHeejin Ahn 
19904c48949SHeejin Ahn   auto *MBB5 = MF->getBlockNumbered(5);
20004c48949SHeejin Ahn   WE0_0 = WEI.getExceptionFor(MBB5);
20104c48949SHeejin Ahn   ASSERT_TRUE(WE0_0);
20204c48949SHeejin Ahn   EXPECT_EQ(WE0_0->getEHPad(), MBB3);
20304c48949SHeejin Ahn 
20404c48949SHeejin Ahn   auto *MBB6 = MF->getBlockNumbered(6);
20504c48949SHeejin Ahn   WE0_0 = WEI.getExceptionFor(MBB6);
20604c48949SHeejin Ahn   ASSERT_TRUE(WE0_0);
20704c48949SHeejin Ahn   EXPECT_EQ(WE0_0->getEHPad(), MBB3);
20804c48949SHeejin Ahn 
20904c48949SHeejin Ahn   auto *MBB10 = MF->getBlockNumbered(10);
21004c48949SHeejin Ahn   WE0_0 = WEI.getExceptionFor(MBB10);
21104c48949SHeejin Ahn   ASSERT_TRUE(WE0_0);
21204c48949SHeejin Ahn   EXPECT_EQ(WE0_0->getEHPad(), MBB3);
21304c48949SHeejin Ahn 
21404c48949SHeejin Ahn   auto *MBB8 = MF->getBlockNumbered(8);
21504c48949SHeejin Ahn   auto *WE0_0_0 = WEI.getExceptionFor(MBB8);
21604c48949SHeejin Ahn   ASSERT_TRUE(WE0_0_0);
21704c48949SHeejin Ahn   EXPECT_EQ(WE0_0_0->getEHPad(), MBB8);
21804c48949SHeejin Ahn   EXPECT_EQ(WE0_0_0->getParentException(), WE0_0);
21904c48949SHeejin Ahn   EXPECT_EQ(WE0_0_0->getExceptionDepth(), (unsigned)3);
22004c48949SHeejin Ahn 
22104c48949SHeejin Ahn   auto *MBB9 = MF->getBlockNumbered(9);
22204c48949SHeejin Ahn   auto *WE0_1 = WEI.getExceptionFor(MBB9);
22304c48949SHeejin Ahn   ASSERT_TRUE(WE0_1);
22404c48949SHeejin Ahn   EXPECT_EQ(WE0_1->getEHPad(), MBB9);
22504c48949SHeejin Ahn   EXPECT_EQ(WE0_1->getParentException(), WE0);
22604c48949SHeejin Ahn   EXPECT_EQ(WE0_1->getExceptionDepth(), (unsigned)2);
22704c48949SHeejin Ahn }
22804c48949SHeejin Ahn 
TEST(WebAssemblyExceptionInfoTest,TEST1)22904c48949SHeejin Ahn TEST(WebAssemblyExceptionInfoTest, TEST1) {
2303d849f67SMatthias Braun   std::unique_ptr<LLVMTargetMachine> TM = createTargetMachine();
23104c48949SHeejin Ahn   ASSERT_TRUE(TM);
23204c48949SHeejin Ahn 
23304c48949SHeejin Ahn   StringRef MIRString = R"MIR(
23404c48949SHeejin Ahn --- |
23504c48949SHeejin Ahn   target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
23604c48949SHeejin Ahn   target triple = "wasm32-unknown-unknown"
23704c48949SHeejin Ahn 
23804c48949SHeejin Ahn   declare i32 @__gxx_wasm_personality_v0(...)
23904c48949SHeejin Ahn 
240d6f48786SHeejin Ahn   define void @test1() personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) {
24104c48949SHeejin Ahn     unreachable
24204c48949SHeejin Ahn   }
24304c48949SHeejin Ahn 
24404c48949SHeejin Ahn ...
24504c48949SHeejin Ahn ---
24604c48949SHeejin Ahn name: test1
24704c48949SHeejin Ahn liveins:
24804c48949SHeejin Ahn   - { reg: '$arguments' }
24904c48949SHeejin Ahn   - { reg: '$value_stack' }
25004c48949SHeejin Ahn body: |
25104c48949SHeejin Ahn   bb.0:
25204c48949SHeejin Ahn     successors: %bb.9, %bb.1
25304c48949SHeejin Ahn     liveins: $arguments, $value_stack
25404c48949SHeejin Ahn     BR %bb.9, implicit-def dead $arguments
25504c48949SHeejin Ahn 
25604c48949SHeejin Ahn   bb.1 (landing-pad):
25704c48949SHeejin Ahn   ; predecessors: %bb.0
25804c48949SHeejin Ahn     successors: %bb.2, %bb.8
25904c48949SHeejin Ahn     liveins: $value_stack
2609e4eadebSHeejin Ahn     %0:i32 = CATCH &__cpp_exception, implicit-def $arguments
26104c48949SHeejin Ahn     BR_IF %bb.2, %32:i32, implicit-def $arguments, implicit-def $value_stack, implicit $value_stack
26204c48949SHeejin Ahn     BR %bb.8, implicit-def $arguments
26304c48949SHeejin Ahn 
26404c48949SHeejin Ahn   bb.2:
26504c48949SHeejin Ahn   ; predecessors: %bb.1
26604c48949SHeejin Ahn     successors: %bb.7, %bb.3, %bb.11
26704c48949SHeejin Ahn     liveins: $value_stack
26804c48949SHeejin Ahn     BR %bb.7, implicit-def dead $arguments
26904c48949SHeejin Ahn 
27004c48949SHeejin Ahn   bb.3 (landing-pad):
27104c48949SHeejin Ahn   ; predecessors: %bb.2
27204c48949SHeejin Ahn     successors: %bb.4, %bb.6
27304c48949SHeejin Ahn     liveins: $value_stack
2749e4eadebSHeejin Ahn     %1:i32 = CATCH &__cpp_exception, implicit-def $arguments
27504c48949SHeejin Ahn     BR_IF %bb.4, %43:i32, implicit-def $arguments, implicit-def $value_stack, implicit $value_stack
27604c48949SHeejin Ahn     BR %bb.6, implicit-def $arguments
27704c48949SHeejin Ahn 
27804c48949SHeejin Ahn   bb.4:
27904c48949SHeejin Ahn   ; predecessors: %bb.3
28004c48949SHeejin Ahn     successors: %bb.5, %bb.10
28104c48949SHeejin Ahn     liveins: $value_stack
28204c48949SHeejin Ahn     BR %bb.5, implicit-def dead $arguments
28304c48949SHeejin Ahn 
28404c48949SHeejin Ahn   bb.5:
28504c48949SHeejin Ahn   ; predecessors: %bb.4
28604c48949SHeejin Ahn     successors: %bb.7(0x80000000); %bb.7(200.00%)
28704c48949SHeejin Ahn     liveins: $value_stack
2889e4eadebSHeejin Ahn     BR %bb.7, implicit-def dead $arguments
28904c48949SHeejin Ahn 
29004c48949SHeejin Ahn   bb.6:
29104c48949SHeejin Ahn   ; predecessors: %bb.3
29204c48949SHeejin Ahn     successors: %bb.12, %bb.11
29304c48949SHeejin Ahn     liveins: $value_stack
29404c48949SHeejin Ahn     BR %bb.12, implicit-def dead $arguments
29504c48949SHeejin Ahn 
29604c48949SHeejin Ahn   bb.7:
29704c48949SHeejin Ahn   ; predecessors: %bb.2, %bb.5
29804c48949SHeejin Ahn     successors: %bb.9(0x80000000); %bb.9(200.00%)
29904c48949SHeejin Ahn     liveins: $value_stack
3009e4eadebSHeejin Ahn     BR %bb.9, implicit-def dead $arguments
30104c48949SHeejin Ahn 
30204c48949SHeejin Ahn   bb.8:
30304c48949SHeejin Ahn   ; predecessors: %bb.1
30404c48949SHeejin Ahn     liveins: $value_stack
30504c48949SHeejin Ahn     UNREACHABLE implicit-def $arguments
30604c48949SHeejin Ahn 
30704c48949SHeejin Ahn   bb.9:
30804c48949SHeejin Ahn   ; predecessors: %bb.0, %bb.7
30904c48949SHeejin Ahn     liveins: $value_stack
3103414bce0SThomas Lively     RETURN implicit-def $arguments
31104c48949SHeejin Ahn 
31204c48949SHeejin Ahn   bb.10 (landing-pad):
31304c48949SHeejin Ahn   ; predecessors: %bb.4
31404c48949SHeejin Ahn     successors: %bb.11
31504c48949SHeejin Ahn     liveins: $value_stack
3169e4eadebSHeejin Ahn     CATCH_ALL implicit-def $arguments
3179e4eadebSHeejin Ahn     RETHROW 0, implicit-def dead $arguments
31804c48949SHeejin Ahn 
31904c48949SHeejin Ahn   bb.11 (landing-pad):
32004c48949SHeejin Ahn   ; predecessors: %bb.2, %bb.6, %bb.10
32104c48949SHeejin Ahn     liveins: $value_stack
3229e4eadebSHeejin Ahn     CATCH_ALL implicit-def $arguments
3239e4eadebSHeejin Ahn     RETHROW 0, implicit-def dead $arguments
32404c48949SHeejin Ahn 
32504c48949SHeejin Ahn   bb.12:
32604c48949SHeejin Ahn   ; predecessors: %bb.6
32704c48949SHeejin Ahn     liveins: $value_stack
32804c48949SHeejin Ahn     UNREACHABLE implicit-def $arguments
32904c48949SHeejin Ahn )MIR";
33004c48949SHeejin Ahn 
33104c48949SHeejin Ahn   LLVMContext Context;
33204c48949SHeejin Ahn   std::unique_ptr<MIRParser> MIR;
33304c48949SHeejin Ahn   MachineModuleInfo MMI(TM.get());
33404c48949SHeejin Ahn   std::unique_ptr<Module> M =
33504c48949SHeejin Ahn       parseMIR(Context, MIR, *TM, MIRString, "test1", MMI);
33604c48949SHeejin Ahn   ASSERT_TRUE(M);
33704c48949SHeejin Ahn 
33804c48949SHeejin Ahn   Function *F = M->getFunction("test1");
33904c48949SHeejin Ahn   auto *MF = MMI.getMachineFunction(*F);
34004c48949SHeejin Ahn   ASSERT_TRUE(MF);
34104c48949SHeejin Ahn 
34204c48949SHeejin Ahn   WebAssemblyExceptionInfo WEI;
34304c48949SHeejin Ahn   MachineDominatorTree MDT;
34404c48949SHeejin Ahn   MachineDominanceFrontier MDF;
34504c48949SHeejin Ahn   MDT.runOnMachineFunction(*MF);
34604c48949SHeejin Ahn   MDF.getBase().analyze(MDT.getBase());
347ea8c6375SHeejin Ahn   WEI.recalculate(*MF, MDT, MDF);
34804c48949SHeejin Ahn 
34904c48949SHeejin Ahn   // Exception info structure:
35004c48949SHeejin Ahn   // |- bb1 (ehpad), bb2, bb3, bb4, bb5, bb6, bb7, bb8, bb10, bb11, bb12
35104c48949SHeejin Ahn   //   |- bb3 (ehpad), bb4, bb5, bb6, bb10, bb12
35204c48949SHeejin Ahn   //     |- bb10 (ehpad)
35304c48949SHeejin Ahn   //   |- bb11 (ehpad)
35404c48949SHeejin Ahn 
35504c48949SHeejin Ahn   auto *MBB1 = MF->getBlockNumbered(1);
35604c48949SHeejin Ahn   auto *WE0 = WEI.getExceptionFor(MBB1);
35704c48949SHeejin Ahn   ASSERT_TRUE(WE0);
35804c48949SHeejin Ahn   EXPECT_EQ(WE0->getEHPad(), MBB1);
35904c48949SHeejin Ahn   EXPECT_EQ(WE0->getParentException(), nullptr);
36004c48949SHeejin Ahn   EXPECT_EQ(WE0->getExceptionDepth(), (unsigned)1);
36104c48949SHeejin Ahn 
36204c48949SHeejin Ahn   auto *MBB2 = MF->getBlockNumbered(2);
36304c48949SHeejin Ahn   WE0 = WEI.getExceptionFor(MBB2);
36404c48949SHeejin Ahn   ASSERT_TRUE(WE0);
36504c48949SHeejin Ahn   EXPECT_EQ(WE0->getEHPad(), MBB1);
36604c48949SHeejin Ahn 
36704c48949SHeejin Ahn   auto *MBB7 = MF->getBlockNumbered(7);
36804c48949SHeejin Ahn   WE0 = WEI.getExceptionFor(MBB7);
36904c48949SHeejin Ahn   ASSERT_TRUE(WE0);
37004c48949SHeejin Ahn   EXPECT_EQ(WE0->getEHPad(), MBB1);
37104c48949SHeejin Ahn 
37204c48949SHeejin Ahn   auto *MBB8 = MF->getBlockNumbered(8);
37304c48949SHeejin Ahn   WE0 = WEI.getExceptionFor(MBB8);
37404c48949SHeejin Ahn   ASSERT_TRUE(WE0);
37504c48949SHeejin Ahn   EXPECT_EQ(WE0->getEHPad(), MBB1);
37604c48949SHeejin Ahn 
37704c48949SHeejin Ahn   auto *MBB3 = MF->getBlockNumbered(3);
37804c48949SHeejin Ahn   auto *WE0_0 = WEI.getExceptionFor(MBB3);
37904c48949SHeejin Ahn   ASSERT_TRUE(WE0_0);
38004c48949SHeejin Ahn   EXPECT_EQ(WE0_0->getEHPad(), MBB3);
38104c48949SHeejin Ahn   EXPECT_EQ(WE0_0->getParentException(), WE0);
38204c48949SHeejin Ahn   EXPECT_EQ(WE0_0->getExceptionDepth(), (unsigned)2);
38304c48949SHeejin Ahn 
38404c48949SHeejin Ahn   auto *MBB4 = MF->getBlockNumbered(4);
38504c48949SHeejin Ahn   WE0_0 = WEI.getExceptionFor(MBB4);
38604c48949SHeejin Ahn   ASSERT_TRUE(WE0_0);
38704c48949SHeejin Ahn   EXPECT_EQ(WE0_0->getEHPad(), MBB3);
38804c48949SHeejin Ahn 
38904c48949SHeejin Ahn   auto *MBB5 = MF->getBlockNumbered(5);
39004c48949SHeejin Ahn   WE0_0 = WEI.getExceptionFor(MBB5);
39104c48949SHeejin Ahn   ASSERT_TRUE(WE0_0);
39204c48949SHeejin Ahn   EXPECT_EQ(WE0_0->getEHPad(), MBB3);
39304c48949SHeejin Ahn 
39404c48949SHeejin Ahn   auto *MBB6 = MF->getBlockNumbered(6);
39504c48949SHeejin Ahn   WE0_0 = WEI.getExceptionFor(MBB6);
39604c48949SHeejin Ahn   ASSERT_TRUE(WE0_0);
39704c48949SHeejin Ahn   EXPECT_EQ(WE0_0->getEHPad(), MBB3);
39804c48949SHeejin Ahn 
39904c48949SHeejin Ahn   auto *MBB12 = MF->getBlockNumbered(12);
40004c48949SHeejin Ahn   WE0_0 = WEI.getExceptionFor(MBB12);
40104c48949SHeejin Ahn   ASSERT_TRUE(WE0_0);
40204c48949SHeejin Ahn   EXPECT_EQ(WE0_0->getEHPad(), MBB3);
40304c48949SHeejin Ahn 
40404c48949SHeejin Ahn   auto *MBB10 = MF->getBlockNumbered(10);
40504c48949SHeejin Ahn   auto *WE0_0_0 = WEI.getExceptionFor(MBB10);
40604c48949SHeejin Ahn   ASSERT_TRUE(WE0_0_0);
40704c48949SHeejin Ahn   EXPECT_EQ(WE0_0_0->getEHPad(), MBB10);
40804c48949SHeejin Ahn   EXPECT_EQ(WE0_0_0->getParentException(), WE0_0);
40904c48949SHeejin Ahn   EXPECT_EQ(WE0_0_0->getExceptionDepth(), (unsigned)3);
41004c48949SHeejin Ahn 
41104c48949SHeejin Ahn   auto *MBB11 = MF->getBlockNumbered(11);
41204c48949SHeejin Ahn   auto *WE0_1 = WEI.getExceptionFor(MBB11);
41304c48949SHeejin Ahn   ASSERT_TRUE(WE0_1);
41404c48949SHeejin Ahn   EXPECT_EQ(WE0_1->getEHPad(), MBB11);
41504c48949SHeejin Ahn   EXPECT_EQ(WE0_1->getParentException(), WE0);
41604c48949SHeejin Ahn   EXPECT_EQ(WE0_1->getExceptionDepth(), (unsigned)2);
41704c48949SHeejin Ahn }
418