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 }