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/array_bounds_check_elimination.h"
17 #include "ecmascript/compiler/combined_pass_visitor.h"
18 #include "ecmascript/compiler/number_gate_info.h"
19 #include "ecmascript/compiler/number_speculative_lowering.h"
20 #include "ecmascript/compiler/number_speculative_runner.h"
21 #include "ecmascript/compiler/range_analysis.h"
22
23 namespace panda::ecmascript::kungfu {
Run()24 void NumberSpeculativeRunner::Run()
25 {
26 CombinedPassVisitor rangeGuardVisitor(circuit_, enableLog_, methodName_, chunk_);
27 RangeGuard rangeGuard(circuit_, &rangeGuardVisitor, chunk_);
28 rangeGuardVisitor.AddPass(&rangeGuard);
29 rangeGuardVisitor.VisitGraph();
30
31 if (IsLogEnabled()) {
32 LOG_COMPILER(INFO) << "";
33 LOG_COMPILER(INFO) << "\033[34m"
34 << "===================="
35 << " After range guard "
36 << "[" << GetMethodName() << "]"
37 << "===================="
38 << "\033[0m";
39 circuit_->PrintAllGatesWithBytecode();
40 LOG_COMPILER(INFO) << "\033[34m" << "========================= End ==========================" << "\033[0m";
41 }
42
43 auto maxId = circuit_->GetMaxGateId();
44 typeInfos_.resize(maxId + 1, TypeInfo::NONE);
45
46 if (enableArrayBoundsCheckElimination_) {
47 ArrayBoundsCheckElimination arrayBoundsCheck(circuit_, enableLog_, methodName_, chunk_);
48 arrayBoundsCheck.Run();
49 if (IsLogEnabled()) {
50 LOG_COMPILER(INFO) << "";
51 LOG_COMPILER(INFO) << "\033[34m"
52 << "===================="
53 << " After array bounds check elimination "
54 << "[" << GetMethodName() << "]"
55 << "===================="
56 << "\033[0m";
57 circuit_->PrintAllGatesWithBytecode();
58 LOG_COMPILER(INFO) << "\033[34m" << "========================= End ==========================" << "\033[0m";
59 }
60 }
61
62 maxId = circuit_->GetMaxGateId();
63 typeInfos_.resize(maxId + 1, TypeInfo::NONE);
64
65 // visit gate in RPO, propagate use infos and
66 // reset the machine type of number operator gate and related phi,
67 // if some tagged phi is used as native value, change it to native phi.
68 NumberSpeculativeRetype retype(circuit_, chunk_, typeInfos_);
69 CombinedPassVisitor retypeVisitor(circuit_, enableLog_, methodName_, chunk_);
70 NumberSpeculativeRetypeManager retypePhase(circuit_, &retypeVisitor, chunk_,
71 &retype, NumberSpeculativeRetype::State::Retype);
72 retypeVisitor.AddPass(&retypePhase);
73 retypeVisitor.VisitGraph();
74 CombinedPassVisitor convertVisitor(circuit_, enableLog_, methodName_, chunk_);
75 NumberSpeculativeRetypeManager convertPhase(circuit_, &convertVisitor,
76 chunk_, &retype, NumberSpeculativeRetype::State::Convert);
77 convertVisitor.AddPass(&convertPhase);
78 convertVisitor.VisitGraph();
79
80 if (IsLogEnabled()) {
81 LOG_COMPILER(INFO) << "";
82 LOG_COMPILER(INFO) << "\033[34m"
83 << "===================="
84 << " After number speculative retype "
85 << "[" << GetMethodName() << "]"
86 << "===================="
87 << "\033[0m";
88 circuit_->PrintAllGatesWithBytecode();
89 LOG_COMPILER(INFO) << "\033[34m" << "========================= End ==========================" << "\033[0m";
90 }
91
92 maxId = circuit_->GetMaxGateId();
93 rangeInfos_.resize(maxId + 1, RangeInfo::NONE());
94 typeInfos_.resize(maxId + 1, TypeInfo::NONE);
95 CombinedPassVisitor rangeAnalysisVisitor(circuit_, enableLog_, methodName_, chunk_);
96 RangeAnalysis rangeAnalysis(circuit_, &rangeAnalysisVisitor, chunk_, typeInfos_, rangeInfos_);
97 rangeAnalysisVisitor.AddPass(&rangeAnalysis);
98 rangeAnalysisVisitor.VisitGraph();
99
100 if (IsLogEnabled()) {
101 LOG_COMPILER(INFO) << "";
102 LOG_COMPILER(INFO) << "\033[34m"
103 << "===================="
104 << " After range analysis "
105 << "[" << GetMethodName() << "]"
106 << "===================="
107 << "\033[0m";
108 rangeAnalysis.PrintRangeInfo();
109 LOG_COMPILER(INFO) << "\033[34m" << "========================= End ==========================" << "\033[0m";
110 }
111
112 NumberSpeculativeLowering lowering(circuit_, chunk_, typeInfos_, rangeInfos_);
113 lowering.Run();
114 if (IsLogEnabled()) {
115 LOG_COMPILER(INFO) << "";
116 LOG_COMPILER(INFO) << "\033[34m"
117 << "===================="
118 << " After number speculative runner "
119 << "[" << GetMethodName() << "]"
120 << "===================="
121 << "\033[0m";
122 circuit_->PrintAllGatesWithBytecode();
123 LOG_COMPILER(INFO) << "\033[34m" << "========================= End ==========================" << "\033[0m";
124 }
125 }
126 } // panda::ecmascript::kungfu
127