1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "ecmascript/compiler/combined_pass_visitor.h"
17 #include "ecmascript/compiler/dead_code_elimination.h"
18 #include "ecmascript/compiler/early_elimination.h"
19 #include "ecmascript/compiler/later_elimination.h"
20 #include "ecmascript/compiler/verifier.h"
21 #include "ecmascript/tests/test_helper.h"
22 
23 namespace panda::test {
24 class CombinedPassVisitorTests : public testing::Test {
25 };
26 using ecmascript::kungfu::Chunk;
27 using ecmascript::kungfu::CombinedPassVisitor;
28 using ecmascript::kungfu::Circuit;
29 using ecmascript::kungfu::CircuitBuilder;
30 using ecmascript::kungfu::DeadCodeElimination;
31 using ecmascript::kungfu::EarlyElimination;
32 using ecmascript::kungfu::Environment;
33 using ecmascript::kungfu::OpCode;
34 using ecmascript::kungfu::GateType;
35 using ecmascript::kungfu::LaterElimination;
36 using ecmascript::kungfu::MachineType;
37 using ecmascript::kungfu::GateAccessor;
38 using ecmascript::kungfu::GateRef;
39 using ecmascript::kungfu::Verifier;
40 using ecmascript::NativeAreaAllocator;
41 
HWTEST_F_L0(CombinedPassVisitorTests, TSLoweringTestFramework)42 HWTEST_F_L0(CombinedPassVisitorTests, TSLoweringTestFramework)
43 {
44     ecmascript::NativeAreaAllocator allocator;
45     Circuit circuit(&allocator);
46     CircuitBuilder builder(&circuit);
47     Environment env(0, &builder);
48     builder.SetEnvironment(&env);
49     GateAccessor acc(&circuit);
50     auto entry = acc.GetStateRoot();
51     auto depend = acc.GetDependRoot();
52     auto arg0 = builder.Arguments(0);
53     auto arg1 = builder.Arguments(1);
54     auto arg2 = builder.Arguments(2);
55     auto dead = circuit.DeadGate();
56     auto icmp = circuit.NewGate(circuit.Icmp(1), MachineType::I1, {arg0, arg1}, GateType::NJSValue());
57     auto ifBranch = circuit.NewGate(circuit.IfBranch(0), {entry, icmp});
58     circuit.NewGate(circuit.IfTrue(), {ifBranch});
59     auto ifFalse = circuit.NewGate(circuit.IfFalse(), {ifBranch});
60     auto merge = circuit.NewGate(circuit.Merge(2), {dead, ifFalse});
61     auto valueSelector = circuit.NewGate(circuit.ValueSelector(2), {merge, arg0, arg1});
62     auto load1 = circuit.NewGate(circuit.LoadElement(2), MachineType::I64,
63                                  {merge, depend, valueSelector, arg2}, GateType::AnyType());
64     auto load2 = circuit.NewGate(circuit.LoadElement(2), MachineType::I64,
65                                  {load1, load1, valueSelector, arg2}, GateType::AnyType());
66     auto circuitReturn = circuit.NewGate(circuit.Return(), {load2, load2, load2, circuit.GetReturnRoot()});
67     Chunk chunk(&allocator);
68     CombinedPassVisitor visitor(&circuit, false, "combined pass visitor test", &chunk);
69     DeadCodeElimination deadCodeElimination(&circuit, &visitor, &chunk);
70     EarlyElimination earlyElimination(&circuit, &visitor, &chunk, true);
71     visitor.AddPass(&deadCodeElimination);
72     visitor.AddPass(&earlyElimination);
73     visitor.VisitGraph();
74     EXPECT_TRUE(acc.IsNop(merge));
75     EXPECT_TRUE(acc.IsNop(valueSelector));
76     EXPECT_TRUE(acc.GetValueIn(load1, 0) == arg1);
77     EXPECT_TRUE(acc.IsNop(load2));
78     EXPECT_TRUE(acc.GetState(circuitReturn) == load1);
79 }
80 
81 }