1b1994897Sopenharmony_ci/*
2b1994897Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3b1994897Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4b1994897Sopenharmony_ci * you may not use this file except in compliance with the License.
5b1994897Sopenharmony_ci * You may obtain a copy of the License at
6b1994897Sopenharmony_ci *
7b1994897Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8b1994897Sopenharmony_ci *
9b1994897Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10b1994897Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11b1994897Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12b1994897Sopenharmony_ci * See the License for the specific language governing permissions and
13b1994897Sopenharmony_ci * limitations under the License.
14b1994897Sopenharmony_ci */
15b1994897Sopenharmony_ci
16b1994897Sopenharmony_ci#include <gtest/gtest.h>
17b1994897Sopenharmony_ci
18b1994897Sopenharmony_ci#include "assembly-parser.h"
19b1994897Sopenharmony_ci#include "bytecode_optimizer/ir_interface.h"
20b1994897Sopenharmony_ci#include "bytecode_optimizer/runtime_adapter.h"
21b1994897Sopenharmony_ci#include "libpandabase/mem/arena_allocator.h"
22b1994897Sopenharmony_ci#include "libpandabase/mem/pool_manager.h"
23b1994897Sopenharmony_ci#include "libpandafile/class_data_accessor.h"
24b1994897Sopenharmony_ci#include "libpandafile/class_data_accessor-inl.h"
25b1994897Sopenharmony_ci#include "libpandafile/method_data_accessor.h"
26b1994897Sopenharmony_ci#include "libpandafile/file.h"
27b1994897Sopenharmony_ci#include "macros.h"
28b1994897Sopenharmony_ci#include "optimizer/ir/graph.h"
29b1994897Sopenharmony_ci#include "optimizer/ir/inst.h"
30b1994897Sopenharmony_ci#include "optimizer/ir/runtime_interface.h"
31b1994897Sopenharmony_ci#include "optimizer/ir_builder/ir_builder.h"
32b1994897Sopenharmony_ci
33b1994897Sopenharmony_cinamespace panda::compiler {
34b1994897Sopenharmony_ciclass IrBuilderTest : public testing::Test {
35b1994897Sopenharmony_cipublic:
36b1994897Sopenharmony_ci    static void SetUpTestCase(void) {};
37b1994897Sopenharmony_ci    static void TearDownTestCase(void) {};
38b1994897Sopenharmony_ci    void SetUp() {};
39b1994897Sopenharmony_ci    void TearDown() {};
40b1994897Sopenharmony_ci
41b1994897Sopenharmony_ci    IrBuilderTest()
42b1994897Sopenharmony_ci    {
43b1994897Sopenharmony_ci        PoolManager::Initialize(PoolType::MALLOC);
44b1994897Sopenharmony_ci    }
45b1994897Sopenharmony_ci
46b1994897Sopenharmony_ci    ~IrBuilderTest()
47b1994897Sopenharmony_ci    {
48b1994897Sopenharmony_ci        PoolManager::Finalize();
49b1994897Sopenharmony_ci    }
50b1994897Sopenharmony_ci
51b1994897Sopenharmony_ci    template <class Callback>
52b1994897Sopenharmony_ci    void TestBuildGraphFromFunc(pandasm::Program &prog, const char *methodName, const Callback &cb)
53b1994897Sopenharmony_ci    {
54b1994897Sopenharmony_ci        pandasm::AsmEmitter::PandaFileToPandaAsmMaps maps {};
55b1994897Sopenharmony_ci        auto pfile = pandasm::AsmEmitter::Emit(prog, &maps);
56b1994897Sopenharmony_ci        for (uint32_t id : pfile->GetClasses()) {
57b1994897Sopenharmony_ci            panda_file::File::EntityId record_id {id};
58b1994897Sopenharmony_ci            panda_file::ClassDataAccessor cda {*pfile, record_id};
59b1994897Sopenharmony_ci
60b1994897Sopenharmony_ci            cda.EnumerateMethods([&prog, maps, methodName, &cb](panda_file::MethodDataAccessor &mda) {
61b1994897Sopenharmony_ci                auto ir_interface = panda::bytecodeopt::BytecodeOptIrInterface(&maps, &prog);
62b1994897Sopenharmony_ci                auto func_name = ir_interface.GetMethodIdByOffset(mda.GetMethodId().GetOffset());
63b1994897Sopenharmony_ci                if (func_name != methodName) {
64b1994897Sopenharmony_ci                    return;
65b1994897Sopenharmony_ci                }
66b1994897Sopenharmony_ci
67b1994897Sopenharmony_ci                ArenaAllocator allocator {SpaceType::SPACE_TYPE_COMPILER};
68b1994897Sopenharmony_ci                ArenaAllocator local_allocator {SpaceType::SPACE_TYPE_COMPILER, nullptr, true};
69b1994897Sopenharmony_ci
70b1994897Sopenharmony_ci                auto method_ptr = reinterpret_cast<compiler::RuntimeInterface::MethodPtr>(
71b1994897Sopenharmony_ci                    mda.GetMethodId().GetOffset());
72b1994897Sopenharmony_ci                panda::BytecodeOptimizerRuntimeAdapter adapter(mda.GetPandaFile());
73b1994897Sopenharmony_ci                auto *graph = allocator.New<Graph>(&allocator, &local_allocator, Arch::NONE, method_ptr, &adapter,
74b1994897Sopenharmony_ci                                                   false, nullptr, true, true);
75b1994897Sopenharmony_ci                graph->RunPass<panda::compiler::IrBuilder>();
76b1994897Sopenharmony_ci                cb(graph);
77b1994897Sopenharmony_ci            });
78b1994897Sopenharmony_ci        }
79b1994897Sopenharmony_ci    }
80b1994897Sopenharmony_ci
81b1994897Sopenharmony_ci    template <class Callback>
82b1994897Sopenharmony_ci    void TestBuildGraphFromFile(const std::string &pFileName, const Callback &cb)
83b1994897Sopenharmony_ci    {
84b1994897Sopenharmony_ci        auto pfile = panda_file::OpenPandaFile(pFileName);
85b1994897Sopenharmony_ci        for (uint32_t id : pfile->GetClasses()) {
86b1994897Sopenharmony_ci            panda_file::File::EntityId record_id {id};
87b1994897Sopenharmony_ci
88b1994897Sopenharmony_ci            if (pfile->IsExternal(record_id)) {
89b1994897Sopenharmony_ci                continue;
90b1994897Sopenharmony_ci            }
91b1994897Sopenharmony_ci
92b1994897Sopenharmony_ci            panda_file::ClassDataAccessor cda {*pfile, record_id};
93b1994897Sopenharmony_ci            cda.EnumerateMethods([&pfile, &cb](panda_file::MethodDataAccessor &mda) {
94b1994897Sopenharmony_ci                if (!mda.IsExternal()) {
95b1994897Sopenharmony_ci                    ArenaAllocator allocator {SpaceType::SPACE_TYPE_COMPILER};
96b1994897Sopenharmony_ci                    ArenaAllocator local_allocator {SpaceType::SPACE_TYPE_COMPILER, nullptr, true};
97b1994897Sopenharmony_ci
98b1994897Sopenharmony_ci                    auto method_ptr = reinterpret_cast<compiler::RuntimeInterface::MethodPtr>(
99b1994897Sopenharmony_ci                        mda.GetMethodId().GetOffset());
100b1994897Sopenharmony_ci                    panda::BytecodeOptimizerRuntimeAdapter adapter(mda.GetPandaFile());
101b1994897Sopenharmony_ci                    auto *graph = allocator.New<Graph>(&allocator, &local_allocator, Arch::NONE, method_ptr, &adapter,
102b1994897Sopenharmony_ci                                                       false, nullptr, true, true);
103b1994897Sopenharmony_ci                    graph->RunPass<panda::compiler::IrBuilder>();
104b1994897Sopenharmony_ci
105b1994897Sopenharmony_ci                    auto method_name = std::string(utf::Mutf8AsCString(pfile->GetStringData(mda.GetNameId()).data));
106b1994897Sopenharmony_ci                    auto pos = method_name.find_last_of("#");
107b1994897Sopenharmony_ci                    if (pos != std::string::npos) {
108b1994897Sopenharmony_ci                        method_name = method_name.substr(pos + 1);
109b1994897Sopenharmony_ci                    }
110b1994897Sopenharmony_ci                    cb(graph, method_name);
111b1994897Sopenharmony_ci                }
112b1994897Sopenharmony_ci            });
113b1994897Sopenharmony_ci        }
114b1994897Sopenharmony_ci    }
115b1994897Sopenharmony_ci};
116b1994897Sopenharmony_ci
117b1994897Sopenharmony_ciHWTEST_F(IrBuilderTest, simpleTryCatchAsm, testing::ext::TestSize.Level1)
118b1994897Sopenharmony_ci{
119b1994897Sopenharmony_ci    /**
120b1994897Sopenharmony_ci     *  try {
121b1994897Sopenharmony_ci     *      a = 1;
122b1994897Sopenharmony_ci     *  } catch(e) {
123b1994897Sopenharmony_ci     *      a = 2;
124b1994897Sopenharmony_ci     *  }
125b1994897Sopenharmony_ci     */
126b1994897Sopenharmony_ci    const auto source = R"(
127b1994897Sopenharmony_ci        .language ECMAScript
128b1994897Sopenharmony_ci        .function any foo(any a0, any a1, any a2) {
129b1994897Sopenharmony_ci            mov v0, a0
130b1994897Sopenharmony_ci            mov v1, a1
131b1994897Sopenharmony_ci            mov v2, a2
132b1994897Sopenharmony_ci        try_begin:
133b1994897Sopenharmony_ci            ldai 0x1
134b1994897Sopenharmony_ci            trystglobalbyname 0x0, "a"
135b1994897Sopenharmony_ci        try_end:
136b1994897Sopenharmony_ci            jmp catch_end
137b1994897Sopenharmony_ci        catch_begin:
138b1994897Sopenharmony_ci            sta v4
139b1994897Sopenharmony_ci            tryldglobalbyname 0x1, "a"
140b1994897Sopenharmony_ci        catch_end:
141b1994897Sopenharmony_ci            returnundefined
142b1994897Sopenharmony_ci        }
143b1994897Sopenharmony_ci    )";
144b1994897Sopenharmony_ci
145b1994897Sopenharmony_ci    panda::pandasm::Parser parser;
146b1994897Sopenharmony_ci    auto res = parser.Parse(source);
147b1994897Sopenharmony_ci    auto &prog = res.Value();
148b1994897Sopenharmony_ci    for (auto &[name, func] : prog.function_table) {
149b1994897Sopenharmony_ci        auto &catchBlock = func.catch_blocks.emplace_back();
150b1994897Sopenharmony_ci        catchBlock.try_begin_label = "try_begin";
151b1994897Sopenharmony_ci        catchBlock.try_end_label = "try_end";
152b1994897Sopenharmony_ci        catchBlock.catch_begin_label = "catch_begin";
153b1994897Sopenharmony_ci        catchBlock.catch_end_label = "catch_end";
154b1994897Sopenharmony_ci    }
155b1994897Sopenharmony_ci
156b1994897Sopenharmony_ci    TestBuildGraphFromFunc(prog, "foo:(any,any,any)", [](Graph* graph) {
157b1994897Sopenharmony_ci        EXPECT_NE(graph, nullptr);
158b1994897Sopenharmony_ci        for (auto bb : graph->GetBlocksRPO()) {
159b1994897Sopenharmony_ci            EXPECT_NE(bb, nullptr);
160b1994897Sopenharmony_ci            if (bb->IsTryBegin()) {
161b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredsBlocks().size() == 1);
162b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccsBlocks().size() == 2);
163b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(0)->IsTry());
164b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch());
165b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin());
166b1994897Sopenharmony_ci
167b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetFirstInst()->IsTry());
168b1994897Sopenharmony_ci                continue;
169b1994897Sopenharmony_ci            }
170b1994897Sopenharmony_ci
171b1994897Sopenharmony_ci            if (bb->IsTry()) {
172b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredsBlocks().size() == 1);
173b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->IsTryBegin());
174b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccsBlocks().size() == 1);
175b1994897Sopenharmony_ci
176b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetFirstInst()->IsSaveState());
177b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic());
178b1994897Sopenharmony_ci                EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() ==
179b1994897Sopenharmony_ci                            RuntimeInterface::IntrinsicId::TRYSTGLOBALBYNAME_IMM8_ID16);
180b1994897Sopenharmony_ci                continue;
181b1994897Sopenharmony_ci            }
182b1994897Sopenharmony_ci
183b1994897Sopenharmony_ci            if (bb->IsTryEnd()) {
184b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredsBlocks().size() == 1);
185b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->IsTry());
186b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccsBlocks().size() == 2);
187b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(0)->GetGuestPc() == bb->GetGuestPc());
188b1994897Sopenharmony_ci                EXPECT_TRUE(!bb->GetSuccessor(0)->IsCatch());
189b1994897Sopenharmony_ci                EXPECT_TRUE(!bb->GetSuccessor(0)->IsCatchBegin());
190b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch());
191b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin());
192b1994897Sopenharmony_ci
193b1994897Sopenharmony_ci                EXPECT_TRUE(bb->IsEmpty());
194b1994897Sopenharmony_ci                continue;
195b1994897Sopenharmony_ci            }
196b1994897Sopenharmony_ci
197b1994897Sopenharmony_ci            if (bb->IsCatchBegin()) {
198b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredsBlocks().size() == 2);
199b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->IsTryBegin());
200b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(1)->IsTryEnd());
201b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(0)->IsCatch());
202b1994897Sopenharmony_ci
203b1994897Sopenharmony_ci                EXPECT_TRUE(bb->IsEmpty());
204b1994897Sopenharmony_ci                continue;
205b1994897Sopenharmony_ci            }
206b1994897Sopenharmony_ci
207b1994897Sopenharmony_ci            if (bb->IsCatch() && !bb->IsCatchBegin()) {
208b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredsBlocks().size() == 1);
209b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->IsCatchBegin());
210b1994897Sopenharmony_ci
211b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(0)->GetFirstInst()->IsSaveState());
212b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(0)->GetLastInst()->IsIntrinsic());
213b1994897Sopenharmony_ci                EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetSuccessor(0)->GetLastInst()))->GetIntrinsicId() ==
214b1994897Sopenharmony_ci                            RuntimeInterface::IntrinsicId::RETURNUNDEFINED);
215b1994897Sopenharmony_ci
216b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetFirstInst()->IsSaveState());
217b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic());
218b1994897Sopenharmony_ci                EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() ==
219b1994897Sopenharmony_ci                            RuntimeInterface::IntrinsicId::TRYLDGLOBALBYNAME_IMM8_ID16);
220b1994897Sopenharmony_ci                continue;
221b1994897Sopenharmony_ci            }
222b1994897Sopenharmony_ci        }
223b1994897Sopenharmony_ci    });
224b1994897Sopenharmony_ci}
225b1994897Sopenharmony_ci
226b1994897Sopenharmony_ciHWTEST_F(IrBuilderTest, nestedTryCatchAsm, testing::ext::TestSize.Level1)
227b1994897Sopenharmony_ci{
228b1994897Sopenharmony_ci    /**
229b1994897Sopenharmony_ci     *  try {
230b1994897Sopenharmony_ci     *      try {
231b1994897Sopenharmony_ci     *          a = 1;
232b1994897Sopenharmony_ci     *      } catch(e) {
233b1994897Sopenharmony_ci     *          a;
234b1994897Sopenharmony_ci     *      }
235b1994897Sopenharmony_ci     *  } catch(e) {
236b1994897Sopenharmony_ci     *      print(e);
237b1994897Sopenharmony_ci     *  }
238b1994897Sopenharmony_ci     */
239b1994897Sopenharmony_ci    const auto source = R"(
240b1994897Sopenharmony_ci        .language ECMAScript
241b1994897Sopenharmony_ci        .function any foo(any a0, any a1, any a2) {
242b1994897Sopenharmony_ci            mov v2, a2
243b1994897Sopenharmony_ci            mov v1, a1
244b1994897Sopenharmony_ci            mov v0, a0
245b1994897Sopenharmony_ci            lda.str "use strict"
246b1994897Sopenharmony_ci        LABEL_0:
247b1994897Sopenharmony_ci        LABEL_1:
248b1994897Sopenharmony_ci            ldai 1
249b1994897Sopenharmony_ci            trystglobalbyname 0, "a"
250b1994897Sopenharmony_ci        LABEL_2:
251b1994897Sopenharmony_ci            jmp LABEL_3
252b1994897Sopenharmony_ci        LABEL_4:
253b1994897Sopenharmony_ci            sta v3
254b1994897Sopenharmony_ci            tryldglobalbyname 1, "a"
255b1994897Sopenharmony_ci        LABEL_3:
256b1994897Sopenharmony_ci        LABEL_5:
257b1994897Sopenharmony_ci            jmp LABEL_6
258b1994897Sopenharmony_ci        LABEL_7:
259b1994897Sopenharmony_ci            sta v4
260b1994897Sopenharmony_ci            tryldglobalbyname 2, "print"
261b1994897Sopenharmony_ci            sta v5
262b1994897Sopenharmony_ci            lda v4
263b1994897Sopenharmony_ci            sta v6
264b1994897Sopenharmony_ci            lda v5
265b1994897Sopenharmony_ci            callarg1 3, v6
266b1994897Sopenharmony_ci        LABEL_6:
267b1994897Sopenharmony_ci            returnundefined
268b1994897Sopenharmony_ci        }
269b1994897Sopenharmony_ci    )";
270b1994897Sopenharmony_ci
271b1994897Sopenharmony_ci    panda::pandasm::Parser parser;
272b1994897Sopenharmony_ci    auto res = parser.Parse(source);
273b1994897Sopenharmony_ci    auto &prog = res.Value();
274b1994897Sopenharmony_ci    EXPECT_TRUE(prog.function_table.size() == 1);
275b1994897Sopenharmony_ci    for (auto &[name, func] : prog.function_table) {
276b1994897Sopenharmony_ci        auto &catchBlock1 = func.catch_blocks.emplace_back();
277b1994897Sopenharmony_ci        catchBlock1.try_begin_label = "LABEL_0";
278b1994897Sopenharmony_ci        catchBlock1.try_end_label = "LABEL_1";
279b1994897Sopenharmony_ci        catchBlock1.catch_begin_label = "LABEL_7";
280b1994897Sopenharmony_ci        catchBlock1.catch_end_label = "LABEL_6";
281b1994897Sopenharmony_ci
282b1994897Sopenharmony_ci        auto &catchBlock2 = func.catch_blocks.emplace_back();
283b1994897Sopenharmony_ci        catchBlock2.try_begin_label = "LABEL_1";
284b1994897Sopenharmony_ci        catchBlock2.try_end_label = "LABEL_2";
285b1994897Sopenharmony_ci        catchBlock2.catch_begin_label = "LABEL_4";
286b1994897Sopenharmony_ci        catchBlock2.catch_end_label = "LABEL_3";
287b1994897Sopenharmony_ci
288b1994897Sopenharmony_ci        auto &catchBlock3 = func.catch_blocks.emplace_back();
289b1994897Sopenharmony_ci        catchBlock3.try_begin_label = "LABEL_2";
290b1994897Sopenharmony_ci        catchBlock3.try_end_label = "LABEL_5";
291b1994897Sopenharmony_ci        catchBlock3.catch_begin_label = "LABEL_7";
292b1994897Sopenharmony_ci        catchBlock3.catch_end_label = "LABEL_6";
293b1994897Sopenharmony_ci    }
294b1994897Sopenharmony_ci
295b1994897Sopenharmony_ci    TestBuildGraphFromFunc(prog, "foo:(any,any,any)", [](Graph* graph) {
296b1994897Sopenharmony_ci        EXPECT_NE(graph, nullptr);
297b1994897Sopenharmony_ci        int32_t numOfTry = 0;
298b1994897Sopenharmony_ci        for (auto bb : graph->GetBlocksRPO()) {
299b1994897Sopenharmony_ci            EXPECT_NE(bb, nullptr);
300b1994897Sopenharmony_ci            if (bb->IsTryBegin()) {
301b1994897Sopenharmony_ci                numOfTry++;
302b1994897Sopenharmony_ci
303b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredsBlocks().size() == 1);
304b1994897Sopenharmony_ci
305b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccsBlocks().size() == 2);
306b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(0)->IsTry());
307b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch());
308b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin());
309b1994897Sopenharmony_ci
310b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(0)->GetTryId() == bb->GetTryId());
311b1994897Sopenharmony_ci                continue;
312b1994897Sopenharmony_ci            }
313b1994897Sopenharmony_ci
314b1994897Sopenharmony_ci            if (bb->IsTry()) {
315b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredsBlocks().size() == 1);
316b1994897Sopenharmony_ci                if (!bb->GetPredecessor(0)->IsTryBegin()) {
317b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetPredecessor(0)->IsCatchBegin());
318b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetPredecessor(0)->IsCatch());
319b1994897Sopenharmony_ci
320b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetFirstInst()->IsSaveState());
321b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic());
322b1994897Sopenharmony_ci                    EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() ==
323b1994897Sopenharmony_ci                                RuntimeInterface::IntrinsicId::TRYLDGLOBALBYNAME_IMM8_ID16);
324b1994897Sopenharmony_ci                    continue;
325b1994897Sopenharmony_ci                }
326b1994897Sopenharmony_ci
327b1994897Sopenharmony_ci
328b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->GetTryId() == bb->GetTryId());
329b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->GetGuestPc() == bb->GetGuestPc());
330b1994897Sopenharmony_ci                if (bb->GetPredecessor(0)->GetTryId() == 1) {
331b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccsBlocks().size() == 1);
332b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(0)->IsTryEnd());
333b1994897Sopenharmony_ci
334b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetFirstInst()->IsSaveState());
335b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic());
336b1994897Sopenharmony_ci                    EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() ==
337b1994897Sopenharmony_ci                                RuntimeInterface::IntrinsicId::TRYSTGLOBALBYNAME_IMM8_ID16);
338b1994897Sopenharmony_ci                    continue;
339b1994897Sopenharmony_ci                }
340b1994897Sopenharmony_ci
341b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->GetTryId() == 2);
342b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccsBlocks().size() == 1);
343b1994897Sopenharmony_ci                EXPECT_TRUE(bb->IsEmpty());
344b1994897Sopenharmony_ci
345b1994897Sopenharmony_ci                for (auto inst : bb->GetSuccessor(0)->AllInsts()) {
346b1994897Sopenharmony_ci                    EXPECT_TRUE(inst->IsPhi());
347b1994897Sopenharmony_ci                }
348b1994897Sopenharmony_ci                continue;
349b1994897Sopenharmony_ci            }
350b1994897Sopenharmony_ci
351b1994897Sopenharmony_ci            if (bb->IsTryEnd()) {
352b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredsBlocks().size() == 1);
353b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->IsTry());
354b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->GetTryId() == bb->GetTryId());
355b1994897Sopenharmony_ci
356b1994897Sopenharmony_ci                EXPECT_TRUE(bb->IsEmpty());
357b1994897Sopenharmony_ci
358b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccsBlocks().size() == 2);
359b1994897Sopenharmony_ci                if (bb->GetTryId() == 1) {
360b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(0)->IsTryBegin());
361b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(0)->GetGuestPc() == bb->GetGuestPc());
362b1994897Sopenharmony_ci
363b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin());
364b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch());
365b1994897Sopenharmony_ci
366b1994897Sopenharmony_ci                    for (auto inst : bb->GetSuccessor(1)->AllInsts()) {
367b1994897Sopenharmony_ci                        EXPECT_TRUE(inst->IsCatchPhi());
368b1994897Sopenharmony_ci                    }
369b1994897Sopenharmony_ci                    continue;
370b1994897Sopenharmony_ci                }
371b1994897Sopenharmony_ci
372b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetTryId() == 2);
373b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin());
374b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch());
375b1994897Sopenharmony_ci                for (auto inst : bb->GetSuccessor(0)->AllInsts()) {
376b1994897Sopenharmony_ci                    EXPECT_TRUE(inst->IsPhi());
377b1994897Sopenharmony_ci                }
378b1994897Sopenharmony_ci                continue;
379b1994897Sopenharmony_ci            }
380b1994897Sopenharmony_ci
381b1994897Sopenharmony_ci            if (bb->IsCatchBegin()) {
382b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredsBlocks().size() == 2);
383b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->IsTryBegin());
384b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(1)->IsTryEnd());
385b1994897Sopenharmony_ci
386b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(0)->IsCatch());
387b1994897Sopenharmony_ci                continue;
388b1994897Sopenharmony_ci            }
389b1994897Sopenharmony_ci
390b1994897Sopenharmony_ci            if (bb->IsCatch() && !bb->IsCatchBegin()) {
391b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredsBlocks().size() == 1);
392b1994897Sopenharmony_ci
393b1994897Sopenharmony_ci                if (bb->IsTry()) {
394b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetTryId() == 2);
395b1994897Sopenharmony_ci
396b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccsBlocks().size() == 1);
397b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(0)->IsTryEnd());
398b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(0)->IsCatch());
399b1994897Sopenharmony_ci
400b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetFirstInst()->IsSaveState());
401b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic());
402b1994897Sopenharmony_ci                    EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() ==
403b1994897Sopenharmony_ci                                RuntimeInterface::IntrinsicId::TRYLDGLOBALBYNAME_IMM8_ID16);
404b1994897Sopenharmony_ci                    continue;
405b1994897Sopenharmony_ci                }
406b1994897Sopenharmony_ci
407b1994897Sopenharmony_ci                if (bb->IsTryEnd()) {
408b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetPredecessor(0)->IsTry());
409b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetPredecessor(0)->IsCatch());
410b1994897Sopenharmony_ci
411b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccsBlocks().size() == 2);
412b1994897Sopenharmony_ci                    for (auto inst : bb->GetSuccessor(0)->AllInsts()) {
413b1994897Sopenharmony_ci                        EXPECT_TRUE(inst->IsPhi());
414b1994897Sopenharmony_ci                    }
415b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin());
416b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch());
417b1994897Sopenharmony_ci
418b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->IsEmpty());
419b1994897Sopenharmony_ci                    continue;
420b1994897Sopenharmony_ci                }
421b1994897Sopenharmony_ci
422b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->IsCatchBegin());
423b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->IsCatch());
424b1994897Sopenharmony_ci
425b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccsBlocks().size() == 1);
426b1994897Sopenharmony_ci                auto *successor = bb->GetSuccessor(0);
427b1994897Sopenharmony_ci                EXPECT_TRUE(successor->GetFirstInst()->IsSaveState());
428b1994897Sopenharmony_ci                EXPECT_TRUE(successor->GetLastInst()->IsIntrinsic());
429b1994897Sopenharmony_ci                EXPECT_TRUE((static_cast<IntrinsicInst *>(successor->GetLastInst()))->GetIntrinsicId() ==
430b1994897Sopenharmony_ci                            RuntimeInterface::IntrinsicId::RETURNUNDEFINED);
431b1994897Sopenharmony_ci                for (auto inst : successor->GetPredecessor(0)->AllInsts()) {
432b1994897Sopenharmony_ci                    EXPECT_TRUE(inst->IsPhi());
433b1994897Sopenharmony_ci                }
434b1994897Sopenharmony_ci
435b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetFirstInst()->IsSaveState());
436b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic());
437b1994897Sopenharmony_ci                EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() ==
438b1994897Sopenharmony_ci                            RuntimeInterface::IntrinsicId::CALLARG1_IMM8_V8);
439b1994897Sopenharmony_ci            }
440b1994897Sopenharmony_ci        }
441b1994897Sopenharmony_ci
442b1994897Sopenharmony_ci        EXPECT_EQ(numOfTry, 2);
443b1994897Sopenharmony_ci    });
444b1994897Sopenharmony_ci}
445b1994897Sopenharmony_ci
446b1994897Sopenharmony_ciHWTEST_F(IrBuilderTest, simpleTryCatchAbc, testing::ext::TestSize.Level1)
447b1994897Sopenharmony_ci{
448b1994897Sopenharmony_ci    std::string pFile = GRAPH_TEST_ABC_DIR "simpleTryCatch.abc";
449b1994897Sopenharmony_ci    const char *testMethodName = "func_main_0";
450b1994897Sopenharmony_ci    TestBuildGraphFromFile(pFile, [&testMethodName](Graph* graph, std::string &methodName) {
451b1994897Sopenharmony_ci        if (testMethodName != methodName) {
452b1994897Sopenharmony_ci            return;
453b1994897Sopenharmony_ci        }
454b1994897Sopenharmony_ci
455b1994897Sopenharmony_ci        EXPECT_NE(graph, nullptr);
456b1994897Sopenharmony_ci        for (auto bb : graph->GetBlocksRPO()) {
457b1994897Sopenharmony_ci            EXPECT_NE(bb, nullptr);
458b1994897Sopenharmony_ci            if (bb->IsTryBegin()) {
459b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredsBlocks().size() == 1);
460b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccsBlocks().size() == 2);
461b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(0)->IsTry());
462b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch());
463b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin());
464b1994897Sopenharmony_ci
465b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetFirstInst()->IsTry());
466b1994897Sopenharmony_ci                continue;
467b1994897Sopenharmony_ci            }
468b1994897Sopenharmony_ci
469b1994897Sopenharmony_ci            if (bb->IsTry()) {
470b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredsBlocks().size() == 1);
471b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->IsTryBegin());
472b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccsBlocks().size() == 1);
473b1994897Sopenharmony_ci
474b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetFirstInst()->IsSaveState());
475b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic());
476b1994897Sopenharmony_ci                EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() ==
477b1994897Sopenharmony_ci                            RuntimeInterface::IntrinsicId::TRYSTGLOBALBYNAME_IMM8_ID16);
478b1994897Sopenharmony_ci                continue;
479b1994897Sopenharmony_ci            }
480b1994897Sopenharmony_ci
481b1994897Sopenharmony_ci            if (bb->IsTryEnd()) {
482b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredsBlocks().size() == 1);
483b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->IsTry());
484b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccsBlocks().size() == 2);
485b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(0)->GetGuestPc() == bb->GetGuestPc());
486b1994897Sopenharmony_ci                EXPECT_TRUE(!bb->GetSuccessor(0)->IsCatch());
487b1994897Sopenharmony_ci                EXPECT_TRUE(!bb->GetSuccessor(0)->IsCatchBegin());
488b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch());
489b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin());
490b1994897Sopenharmony_ci
491b1994897Sopenharmony_ci                EXPECT_TRUE(bb->IsEmpty());
492b1994897Sopenharmony_ci                continue;
493b1994897Sopenharmony_ci            }
494b1994897Sopenharmony_ci
495b1994897Sopenharmony_ci            if (bb->IsCatchBegin()) {
496b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredsBlocks().size() == 2);
497b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->IsTryBegin());
498b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(1)->IsTryEnd());
499b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(0)->IsCatch());
500b1994897Sopenharmony_ci
501b1994897Sopenharmony_ci                EXPECT_TRUE(bb->IsEmpty());
502b1994897Sopenharmony_ci                continue;
503b1994897Sopenharmony_ci            }
504b1994897Sopenharmony_ci
505b1994897Sopenharmony_ci            if (bb->IsCatch() && !bb->IsCatchBegin()) {
506b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredsBlocks().size() == 1);
507b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->IsCatchBegin());
508b1994897Sopenharmony_ci
509b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(0)->GetFirstInst()->IsSaveState());
510b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(0)->GetLastInst()->IsIntrinsic());
511b1994897Sopenharmony_ci                EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetSuccessor(0)->GetLastInst()))->GetIntrinsicId() ==
512b1994897Sopenharmony_ci                            RuntimeInterface::IntrinsicId::RETURNUNDEFINED);
513b1994897Sopenharmony_ci
514b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetFirstInst()->IsSaveState());
515b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic());
516b1994897Sopenharmony_ci                EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() ==
517b1994897Sopenharmony_ci                            RuntimeInterface::IntrinsicId::TRYLDGLOBALBYNAME_IMM8_ID16);
518b1994897Sopenharmony_ci                continue;
519b1994897Sopenharmony_ci            }
520b1994897Sopenharmony_ci        }
521b1994897Sopenharmony_ci    });
522b1994897Sopenharmony_ci}
523b1994897Sopenharmony_ci
524b1994897Sopenharmony_ciHWTEST_F(IrBuilderTest, nestedTryCatchAbc, testing::ext::TestSize.Level1)
525b1994897Sopenharmony_ci{
526b1994897Sopenharmony_ci    std::string pFile = GRAPH_TEST_ABC_DIR "nestedTryCatch.abc";
527b1994897Sopenharmony_ci    const char *testMethodName = "func_main_0";
528b1994897Sopenharmony_ci    TestBuildGraphFromFile(pFile, [testMethodName](Graph* graph, std::string &methodName) {
529b1994897Sopenharmony_ci        if (testMethodName != methodName) {
530b1994897Sopenharmony_ci            return;
531b1994897Sopenharmony_ci        }
532b1994897Sopenharmony_ci
533b1994897Sopenharmony_ci        EXPECT_NE(graph, nullptr);
534b1994897Sopenharmony_ci        int32_t numOfTry = 0;
535b1994897Sopenharmony_ci        for (auto bb : graph->GetBlocksRPO()) {
536b1994897Sopenharmony_ci            EXPECT_NE(bb, nullptr);
537b1994897Sopenharmony_ci            if (bb->IsTryBegin()) {
538b1994897Sopenharmony_ci                numOfTry++;
539b1994897Sopenharmony_ci
540b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredsBlocks().size() == 1);
541b1994897Sopenharmony_ci
542b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccsBlocks().size() == 2);
543b1994897Sopenharmony_ci
544b1994897Sopenharmony_ci                if (bb->GetTryId() == 0) {
545b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(0)->IsTry());
546b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch());
547b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin());
548b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(0)->GetTryId() == bb->GetTryId());
549b1994897Sopenharmony_ci                }
550b1994897Sopenharmony_ci
551b1994897Sopenharmony_ci                if (bb->GetTryId() == 1) {
552b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(0)->IsTryBegin());
553b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch());
554b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin());
555b1994897Sopenharmony_ci                }
556b1994897Sopenharmony_ci
557b1994897Sopenharmony_ci                continue;
558b1994897Sopenharmony_ci            }
559b1994897Sopenharmony_ci
560b1994897Sopenharmony_ci            if (bb->IsTry()) {
561b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredsBlocks().size() == 1);
562b1994897Sopenharmony_ci                if (bb->GetPredecessor(0)->IsTryBegin()) {
563b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetPredecessor(0)->GetTryId() == bb->GetTryId());
564b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetPredecessor(0)->GetTryId() == 0);
565b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetPredecessor(0)->GetGuestPc() == bb->GetGuestPc());
566b1994897Sopenharmony_ci
567b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccsBlocks().size() == 1);
568b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(0)->IsTryEnd());
569b1994897Sopenharmony_ci
570b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetFirstInst()->IsSaveState());
571b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic());
572b1994897Sopenharmony_ci                    EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() ==
573b1994897Sopenharmony_ci                                RuntimeInterface::IntrinsicId::TRYSTGLOBALBYNAME_IMM8_ID16);
574b1994897Sopenharmony_ci                    continue;
575b1994897Sopenharmony_ci                }
576b1994897Sopenharmony_ci
577b1994897Sopenharmony_ci                if (bb->GetPredecessor(0)->IsTryEnd()) {
578b1994897Sopenharmony_ci                    EXPECT_FALSE(bb->GetPredecessor(0)->GetTryId() == bb->GetTryId());
579b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetPredecessor(0)->GetGuestPc() == bb->GetGuestPc());
580b1994897Sopenharmony_ci
581b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccsBlocks().size() == 1);
582b1994897Sopenharmony_ci                    for (auto inst : bb->GetSuccessor(0)->AllInsts()) {
583b1994897Sopenharmony_ci                        EXPECT_TRUE(inst->IsPhi());
584b1994897Sopenharmony_ci                    }
585b1994897Sopenharmony_ci                    continue;
586b1994897Sopenharmony_ci                }
587b1994897Sopenharmony_ci
588b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->IsCatchBegin());
589b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->IsCatch());
590b1994897Sopenharmony_ci
591b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccsBlocks().size() == 1);
592b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(0)->IsCatch());
593b1994897Sopenharmony_ci
594b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetFirstInst()->IsSaveState());
595b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic());
596b1994897Sopenharmony_ci                EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() ==
597b1994897Sopenharmony_ci                            RuntimeInterface::IntrinsicId::TRYLDGLOBALBYNAME_IMM8_ID16);
598b1994897Sopenharmony_ci                continue;
599b1994897Sopenharmony_ci            }
600b1994897Sopenharmony_ci
601b1994897Sopenharmony_ci            if (bb->IsTryEnd()) {
602b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredsBlocks().size() == 1);
603b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->IsTry());
604b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->GetTryId() == bb->GetTryId());
605b1994897Sopenharmony_ci
606b1994897Sopenharmony_ci                EXPECT_TRUE(bb->IsEmpty());
607b1994897Sopenharmony_ci
608b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccsBlocks().size() == 2);
609b1994897Sopenharmony_ci                if (bb->GetTryId() == 0) {
610b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(0)->IsTry());
611b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(0)->GetGuestPc() == bb->GetGuestPc());
612b1994897Sopenharmony_ci
613b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin());
614b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch());
615b1994897Sopenharmony_ci
616b1994897Sopenharmony_ci                    for (auto inst : bb->GetSuccessor(1)->AllInsts()) {
617b1994897Sopenharmony_ci                        EXPECT_TRUE(inst->IsCatchPhi());
618b1994897Sopenharmony_ci                    }
619b1994897Sopenharmony_ci                    continue;
620b1994897Sopenharmony_ci                }
621b1994897Sopenharmony_ci
622b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetTryId() == 1);
623b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin());
624b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch());
625b1994897Sopenharmony_ci                for (auto inst : bb->GetSuccessor(0)->AllInsts()) {
626b1994897Sopenharmony_ci                    EXPECT_TRUE(inst->IsPhi());
627b1994897Sopenharmony_ci                }
628b1994897Sopenharmony_ci                continue;
629b1994897Sopenharmony_ci            }
630b1994897Sopenharmony_ci
631b1994897Sopenharmony_ci            if (bb->IsCatchBegin()) {
632b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredsBlocks().size() == 2);
633b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->IsTryBegin());
634b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(1)->IsTryEnd());
635b1994897Sopenharmony_ci
636b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccessor(0)->IsCatch());
637b1994897Sopenharmony_ci                continue;
638b1994897Sopenharmony_ci            }
639b1994897Sopenharmony_ci
640b1994897Sopenharmony_ci            if (bb->IsCatch() && !bb->IsCatchBegin()) {
641b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredsBlocks().size() == 1);
642b1994897Sopenharmony_ci
643b1994897Sopenharmony_ci                if (bb->IsTry()) {
644b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetTryId() == 2);
645b1994897Sopenharmony_ci
646b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccsBlocks().size() == 1);
647b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(0)->IsTryEnd());
648b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(0)->IsCatch());
649b1994897Sopenharmony_ci
650b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetFirstInst()->IsSaveState());
651b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic());
652b1994897Sopenharmony_ci                    EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() ==
653b1994897Sopenharmony_ci                                RuntimeInterface::IntrinsicId::TRYLDGLOBALBYNAME_IMM8_ID16);
654b1994897Sopenharmony_ci                    continue;
655b1994897Sopenharmony_ci                }
656b1994897Sopenharmony_ci
657b1994897Sopenharmony_ci                if (bb->IsTryEnd()) {
658b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetPredecessor(0)->IsTry());
659b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetPredecessor(0)->IsCatch());
660b1994897Sopenharmony_ci
661b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccsBlocks().size() == 2);
662b1994897Sopenharmony_ci                    for (auto inst : bb->GetSuccessor(0)->AllInsts()) {
663b1994897Sopenharmony_ci                        EXPECT_TRUE(inst->IsPhi());
664b1994897Sopenharmony_ci                    }
665b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(1)->IsCatchBegin());
666b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->GetSuccessor(1)->IsCatch());
667b1994897Sopenharmony_ci
668b1994897Sopenharmony_ci                    EXPECT_TRUE(bb->IsEmpty());
669b1994897Sopenharmony_ci                    continue;
670b1994897Sopenharmony_ci                }
671b1994897Sopenharmony_ci
672b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->IsCatchBegin());
673b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetPredecessor(0)->IsCatch());
674b1994897Sopenharmony_ci
675b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetSuccsBlocks().size() == 1);
676b1994897Sopenharmony_ci                auto *successor = bb->GetSuccessor(0);
677b1994897Sopenharmony_ci                EXPECT_TRUE(successor->GetFirstInst()->IsSaveState());
678b1994897Sopenharmony_ci                EXPECT_TRUE(successor->GetLastInst()->IsIntrinsic());
679b1994897Sopenharmony_ci                EXPECT_TRUE((static_cast<IntrinsicInst *>(successor->GetLastInst()))->GetIntrinsicId() ==
680b1994897Sopenharmony_ci                            RuntimeInterface::IntrinsicId::RETURNUNDEFINED);
681b1994897Sopenharmony_ci                for (auto inst : successor->GetPredecessor(0)->AllInsts()) {
682b1994897Sopenharmony_ci                    EXPECT_TRUE(inst->IsPhi());
683b1994897Sopenharmony_ci                }
684b1994897Sopenharmony_ci
685b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetFirstInst()->IsSaveState());
686b1994897Sopenharmony_ci                EXPECT_TRUE(bb->GetLastInst()->IsIntrinsic());
687b1994897Sopenharmony_ci                EXPECT_TRUE((static_cast<IntrinsicInst *>(bb->GetLastInst()))->GetIntrinsicId() ==
688b1994897Sopenharmony_ci                            RuntimeInterface::IntrinsicId::CALLARG1_IMM8_V8);
689b1994897Sopenharmony_ci            }
690b1994897Sopenharmony_ci        }
691b1994897Sopenharmony_ci
692b1994897Sopenharmony_ci        EXPECT_EQ(numOfTry, 2);
693b1994897Sopenharmony_ci    });
694b1994897Sopenharmony_ci}
695b1994897Sopenharmony_ci} // namespace panda::compiler