• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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