Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Side by Side Diff: src/compiler/pipeline.cc

Issue 1192553002: [turbofan] Fix life time and use of the Typer. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Address Michis comments. Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/compiler/typer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/compiler/pipeline.h" 5 #include "src/compiler/pipeline.h"
6 6
7 #include <fstream> // NOLINT(readability/streams) 7 #include <fstream> // NOLINT(readability/streams)
8 #include <sstream> 8 #include <sstream>
9 9
10 #include "src/base/adapters.h" 10 #include "src/base/adapters.h"
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 code_(Handle<Code>::null()), 72 code_(Handle<Code>::null()),
73 graph_zone_scope_(zone_pool_), 73 graph_zone_scope_(zone_pool_),
74 graph_zone_(graph_zone_scope_.zone()), 74 graph_zone_(graph_zone_scope_.zone()),
75 graph_(nullptr), 75 graph_(nullptr),
76 loop_assignment_(nullptr), 76 loop_assignment_(nullptr),
77 machine_(nullptr), 77 machine_(nullptr),
78 common_(nullptr), 78 common_(nullptr),
79 javascript_(nullptr), 79 javascript_(nullptr),
80 jsgraph_(nullptr), 80 jsgraph_(nullptr),
81 js_type_feedback_(nullptr), 81 js_type_feedback_(nullptr),
82 typer_(nullptr),
83 schedule_(nullptr), 82 schedule_(nullptr),
84 instruction_zone_scope_(zone_pool_), 83 instruction_zone_scope_(zone_pool_),
85 instruction_zone_(instruction_zone_scope_.zone()), 84 instruction_zone_(instruction_zone_scope_.zone()),
86 sequence_(nullptr), 85 sequence_(nullptr),
87 frame_(nullptr), 86 frame_(nullptr),
88 register_allocation_zone_scope_(zone_pool_), 87 register_allocation_zone_scope_(zone_pool_),
89 register_allocation_zone_(register_allocation_zone_scope_.zone()), 88 register_allocation_zone_(register_allocation_zone_scope_.zone()),
90 register_allocation_data_(nullptr) { 89 register_allocation_data_(nullptr) {
91 PhaseScope scope(pipeline_statistics, "init pipeline data"); 90 PhaseScope scope(pipeline_statistics, "init pipeline data");
92 graph_ = new (graph_zone_) Graph(graph_zone_); 91 graph_ = new (graph_zone_) Graph(graph_zone_);
93 source_positions_.Reset(new SourcePositionTable(graph_)); 92 source_positions_.Reset(new SourcePositionTable(graph_));
94 machine_ = new (graph_zone_) MachineOperatorBuilder( 93 machine_ = new (graph_zone_) MachineOperatorBuilder(
95 graph_zone_, kMachPtr, 94 graph_zone_, kMachPtr,
96 InstructionSelector::SupportedMachineOperatorFlags()); 95 InstructionSelector::SupportedMachineOperatorFlags());
97 common_ = new (graph_zone_) CommonOperatorBuilder(graph_zone_); 96 common_ = new (graph_zone_) CommonOperatorBuilder(graph_zone_);
98 javascript_ = new (graph_zone_) JSOperatorBuilder(graph_zone_); 97 javascript_ = new (graph_zone_) JSOperatorBuilder(graph_zone_);
99 jsgraph_ = new (graph_zone_) 98 jsgraph_ = new (graph_zone_)
100 JSGraph(isolate_, graph_, common_, javascript_, machine_); 99 JSGraph(isolate_, graph_, common_, javascript_, machine_);
101 typer_.Reset(new Typer(isolate_, graph_, info_->context()));
102 } 100 }
103 101
104 // For machine graph testing entry point. 102 // For machine graph testing entry point.
105 PipelineData(ZonePool* zone_pool, CompilationInfo* info, Graph* graph, 103 PipelineData(ZonePool* zone_pool, CompilationInfo* info, Graph* graph,
106 Schedule* schedule) 104 Schedule* schedule)
107 : isolate_(info->isolate()), 105 : isolate_(info->isolate()),
108 info_(info), 106 info_(info),
109 outer_zone_(nullptr), 107 outer_zone_(nullptr),
110 zone_pool_(zone_pool), 108 zone_pool_(zone_pool),
111 pipeline_statistics_(nullptr), 109 pipeline_statistics_(nullptr),
112 compilation_failed_(false), 110 compilation_failed_(false),
113 code_(Handle<Code>::null()), 111 code_(Handle<Code>::null()),
114 graph_zone_scope_(zone_pool_), 112 graph_zone_scope_(zone_pool_),
115 graph_zone_(nullptr), 113 graph_zone_(nullptr),
116 graph_(graph), 114 graph_(graph),
117 source_positions_(new SourcePositionTable(graph_)), 115 source_positions_(new SourcePositionTable(graph_)),
118 loop_assignment_(nullptr), 116 loop_assignment_(nullptr),
119 machine_(nullptr), 117 machine_(nullptr),
120 common_(nullptr), 118 common_(nullptr),
121 javascript_(nullptr), 119 javascript_(nullptr),
122 jsgraph_(nullptr), 120 jsgraph_(nullptr),
123 js_type_feedback_(nullptr), 121 js_type_feedback_(nullptr),
124 typer_(nullptr),
125 schedule_(schedule), 122 schedule_(schedule),
126 instruction_zone_scope_(zone_pool_), 123 instruction_zone_scope_(zone_pool_),
127 instruction_zone_(instruction_zone_scope_.zone()), 124 instruction_zone_(instruction_zone_scope_.zone()),
128 sequence_(nullptr), 125 sequence_(nullptr),
129 frame_(nullptr), 126 frame_(nullptr),
130 register_allocation_zone_scope_(zone_pool_), 127 register_allocation_zone_scope_(zone_pool_),
131 register_allocation_zone_(register_allocation_zone_scope_.zone()), 128 register_allocation_zone_(register_allocation_zone_scope_.zone()),
132 register_allocation_data_(nullptr) {} 129 register_allocation_data_(nullptr) {}
133 130
134 // For register allocation testing entry point. 131 // For register allocation testing entry point.
135 PipelineData(ZonePool* zone_pool, CompilationInfo* info, 132 PipelineData(ZonePool* zone_pool, CompilationInfo* info,
136 InstructionSequence* sequence) 133 InstructionSequence* sequence)
137 : isolate_(info->isolate()), 134 : isolate_(info->isolate()),
138 info_(info), 135 info_(info),
139 outer_zone_(nullptr), 136 outer_zone_(nullptr),
140 zone_pool_(zone_pool), 137 zone_pool_(zone_pool),
141 pipeline_statistics_(nullptr), 138 pipeline_statistics_(nullptr),
142 compilation_failed_(false), 139 compilation_failed_(false),
143 code_(Handle<Code>::null()), 140 code_(Handle<Code>::null()),
144 graph_zone_scope_(zone_pool_), 141 graph_zone_scope_(zone_pool_),
145 graph_zone_(nullptr), 142 graph_zone_(nullptr),
146 graph_(nullptr), 143 graph_(nullptr),
147 loop_assignment_(nullptr), 144 loop_assignment_(nullptr),
148 machine_(nullptr), 145 machine_(nullptr),
149 common_(nullptr), 146 common_(nullptr),
150 javascript_(nullptr), 147 javascript_(nullptr),
151 jsgraph_(nullptr), 148 jsgraph_(nullptr),
152 js_type_feedback_(nullptr), 149 js_type_feedback_(nullptr),
153 typer_(nullptr),
154 schedule_(nullptr), 150 schedule_(nullptr),
155 instruction_zone_scope_(zone_pool_), 151 instruction_zone_scope_(zone_pool_),
156 instruction_zone_(sequence->zone()), 152 instruction_zone_(sequence->zone()),
157 sequence_(sequence), 153 sequence_(sequence),
158 frame_(nullptr), 154 frame_(nullptr),
159 register_allocation_zone_scope_(zone_pool_), 155 register_allocation_zone_scope_(zone_pool_),
160 register_allocation_zone_(register_allocation_zone_scope_.zone()), 156 register_allocation_zone_(register_allocation_zone_scope_.zone()),
161 register_allocation_data_(nullptr) {} 157 register_allocation_data_(nullptr) {}
162 158
163 ~PipelineData() { 159 ~PipelineData() {
(...skipping 23 matching lines...) Expand all
187 return source_positions_.get(); 183 return source_positions_.get();
188 } 184 }
189 MachineOperatorBuilder* machine() const { return machine_; } 185 MachineOperatorBuilder* machine() const { return machine_; }
190 CommonOperatorBuilder* common() const { return common_; } 186 CommonOperatorBuilder* common() const { return common_; }
191 JSOperatorBuilder* javascript() const { return javascript_; } 187 JSOperatorBuilder* javascript() const { return javascript_; }
192 JSGraph* jsgraph() const { return jsgraph_; } 188 JSGraph* jsgraph() const { return jsgraph_; }
193 JSTypeFeedbackTable* js_type_feedback() { return js_type_feedback_; } 189 JSTypeFeedbackTable* js_type_feedback() { return js_type_feedback_; }
194 void set_js_type_feedback(JSTypeFeedbackTable* js_type_feedback) { 190 void set_js_type_feedback(JSTypeFeedbackTable* js_type_feedback) {
195 js_type_feedback_ = js_type_feedback; 191 js_type_feedback_ = js_type_feedback;
196 } 192 }
197 Typer* typer() const { return typer_.get(); }
198 193
199 LoopAssignmentAnalysis* loop_assignment() const { return loop_assignment_; } 194 LoopAssignmentAnalysis* loop_assignment() const { return loop_assignment_; }
200 void set_loop_assignment(LoopAssignmentAnalysis* loop_assignment) { 195 void set_loop_assignment(LoopAssignmentAnalysis* loop_assignment) {
201 DCHECK(!loop_assignment_); 196 DCHECK(!loop_assignment_);
202 loop_assignment_ = loop_assignment; 197 loop_assignment_ = loop_assignment;
203 } 198 }
204 199
205 Schedule* schedule() const { return schedule_; } 200 Schedule* schedule() const { return schedule_; }
206 void set_schedule(Schedule* schedule) { 201 void set_schedule(Schedule* schedule) {
207 DCHECK(!schedule_); 202 DCHECK(!schedule_);
208 schedule_ = schedule; 203 schedule_ = schedule;
209 } 204 }
210 205
211 Zone* instruction_zone() const { return instruction_zone_; } 206 Zone* instruction_zone() const { return instruction_zone_; }
212 InstructionSequence* sequence() const { return sequence_; } 207 InstructionSequence* sequence() const { return sequence_; }
213 Frame* frame() const { return frame_; } 208 Frame* frame() const { return frame_; }
214 209
215 Zone* register_allocation_zone() const { return register_allocation_zone_; } 210 Zone* register_allocation_zone() const { return register_allocation_zone_; }
216 RegisterAllocationData* register_allocation_data() const { 211 RegisterAllocationData* register_allocation_data() const {
217 return register_allocation_data_; 212 return register_allocation_data_;
218 } 213 }
219 214
220 void DeleteGraphZone() { 215 void DeleteGraphZone() {
221 // Destroy objects with destructors first. 216 // Destroy objects with destructors first.
222 source_positions_.Reset(nullptr); 217 source_positions_.Reset(nullptr);
223 typer_.Reset(nullptr);
224 if (graph_zone_ == nullptr) return; 218 if (graph_zone_ == nullptr) return;
225 // Destroy zone and clear pointers. 219 // Destroy zone and clear pointers.
226 graph_zone_scope_.Destroy(); 220 graph_zone_scope_.Destroy();
227 graph_zone_ = nullptr; 221 graph_zone_ = nullptr;
228 graph_ = nullptr; 222 graph_ = nullptr;
229 loop_assignment_ = nullptr; 223 loop_assignment_ = nullptr;
230 machine_ = nullptr; 224 machine_ = nullptr;
231 common_ = nullptr; 225 common_ = nullptr;
232 javascript_ = nullptr; 226 javascript_ = nullptr;
233 jsgraph_ = nullptr; 227 jsgraph_ = nullptr;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 Zone* graph_zone_; 278 Zone* graph_zone_;
285 Graph* graph_; 279 Graph* graph_;
286 // TODO(dcarney): make this into a ZoneObject. 280 // TODO(dcarney): make this into a ZoneObject.
287 SmartPointer<SourcePositionTable> source_positions_; 281 SmartPointer<SourcePositionTable> source_positions_;
288 LoopAssignmentAnalysis* loop_assignment_; 282 LoopAssignmentAnalysis* loop_assignment_;
289 MachineOperatorBuilder* machine_; 283 MachineOperatorBuilder* machine_;
290 CommonOperatorBuilder* common_; 284 CommonOperatorBuilder* common_;
291 JSOperatorBuilder* javascript_; 285 JSOperatorBuilder* javascript_;
292 JSGraph* jsgraph_; 286 JSGraph* jsgraph_;
293 JSTypeFeedbackTable* js_type_feedback_; 287 JSTypeFeedbackTable* js_type_feedback_;
294 // TODO(dcarney): make this into a ZoneObject.
295 SmartPointer<Typer> typer_;
296 Schedule* schedule_; 288 Schedule* schedule_;
297 289
298 // All objects in the following group of fields are allocated in 290 // All objects in the following group of fields are allocated in
299 // instruction_zone_. They are all set to NULL when the instruction_zone_ is 291 // instruction_zone_. They are all set to NULL when the instruction_zone_ is
300 // destroyed. 292 // destroyed.
301 ZonePool::Scope instruction_zone_scope_; 293 ZonePool::Scope instruction_zone_scope_;
302 Zone* instruction_zone_; 294 Zone* instruction_zone_;
303 InstructionSequence* sequence_; 295 InstructionSequence* sequence_;
304 Frame* frame_; 296 Frame* frame_;
305 297
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
517 temp_zone, data->info(), data->jsgraph()); 509 temp_zone, data->info(), data->jsgraph());
518 AddReducer(data, &graph_reducer, &inliner); 510 AddReducer(data, &graph_reducer, &inliner);
519 graph_reducer.ReduceGraph(); 511 graph_reducer.ReduceGraph();
520 } 512 }
521 }; 513 };
522 514
523 515
524 struct TyperPhase { 516 struct TyperPhase {
525 static const char* phase_name() { return "typer"; } 517 static const char* phase_name() { return "typer"; }
526 518
527 void Run(PipelineData* data, Zone* temp_zone) { data->typer()->Run(); } 519 void Run(PipelineData* data, Zone* temp_zone, Typer* typer) {
520 NodeVector roots(temp_zone);
521 data->jsgraph()->GetCachedNodes(&roots);
522 typer->Run(roots);
523 }
528 }; 524 };
529 525
530 526
531 struct OsrDeconstructionPhase { 527 struct OsrDeconstructionPhase {
532 static const char* phase_name() { return "OSR deconstruction"; } 528 static const char* phase_name() { return "OSR deconstruction"; }
533 529
534 void Run(PipelineData* data, Zone* temp_zone) { 530 void Run(PipelineData* data, Zone* temp_zone) {
535 OsrHelper osr_helper(data->info()); 531 OsrHelper osr_helper(data->info());
536 osr_helper.Deconstruct(data->jsgraph(), data->common(), temp_zone); 532 osr_helper.Deconstruct(data->jsgraph(), data->common(), temp_zone);
537 } 533 }
(...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after
1051 RunPrintAndVerify("Early trimmed", true); 1047 RunPrintAndVerify("Early trimmed", true);
1052 1048
1053 if (FLAG_print_turbo_replay) { 1049 if (FLAG_print_turbo_replay) {
1054 // Print a replay of the initial graph. 1050 // Print a replay of the initial graph.
1055 GraphReplayPrinter::PrintReplay(data.graph()); 1051 GraphReplayPrinter::PrintReplay(data.graph());
1056 } 1052 }
1057 1053
1058 // Bailout here in case target architecture is not supported. 1054 // Bailout here in case target architecture is not supported.
1059 if (!SupportedTarget()) return Handle<Code>::null(); 1055 if (!SupportedTarget()) return Handle<Code>::null();
1060 1056
1057 SmartPointer<Typer> typer;
1061 if (info()->is_typing_enabled()) { 1058 if (info()->is_typing_enabled()) {
1062 // Type the graph. 1059 // Type the graph.
1063 Run<TyperPhase>(); 1060 typer.Reset(new Typer(isolate(), data.graph(), info()->context()));
1061 Run<TyperPhase>(typer.get());
1064 RunPrintAndVerify("Typed"); 1062 RunPrintAndVerify("Typed");
1065 } 1063 }
1066 1064
1067 BeginPhaseKind("lowering"); 1065 BeginPhaseKind("lowering");
1068 1066
1069 if (info()->is_typing_enabled()) { 1067 if (info()->is_typing_enabled()) {
1070 // Lower JSOperators where we can determine types. 1068 // Lower JSOperators where we can determine types.
1071 Run<TypedLoweringPhase>(); 1069 Run<TypedLoweringPhase>();
1072 RunPrintAndVerify("Lowered typed"); 1070 RunPrintAndVerify("Lowered typed");
1073 1071
1074 if (FLAG_turbo_stress_loop_peeling) { 1072 if (FLAG_turbo_stress_loop_peeling) {
1075 Run<StressLoopPeelingPhase>(); 1073 Run<StressLoopPeelingPhase>();
1076 RunPrintAndVerify("Loop peeled", true); 1074 RunPrintAndVerify("Loop peeled");
1077 } 1075 }
1078 1076
1079 if (info()->is_osr()) { 1077 if (info()->is_osr()) {
1080 Run<OsrDeconstructionPhase>(); 1078 Run<OsrDeconstructionPhase>();
1081 RunPrintAndVerify("OSR deconstruction"); 1079 RunPrintAndVerify("OSR deconstruction");
1082 } 1080 }
1083 1081
1084 if (info()->is_type_feedback_enabled()) { 1082 if (info()->is_type_feedback_enabled()) {
1085 Run<JSTypeFeedbackPhase>(); 1083 Run<JSTypeFeedbackPhase>();
1086 RunPrintAndVerify("JSType feedback"); 1084 RunPrintAndVerify("JSType feedback");
(...skipping 13 matching lines...) Expand all
1100 Run<ChangeLoweringPhase>(); 1098 Run<ChangeLoweringPhase>();
1101 // TODO(jarin, rossberg): Remove UNTYPED once machine typing works. 1099 // TODO(jarin, rossberg): Remove UNTYPED once machine typing works.
1102 RunPrintAndVerify("Lowered changes", true); 1100 RunPrintAndVerify("Lowered changes", true);
1103 1101
1104 Run<LateControlReductionPhase>(); 1102 Run<LateControlReductionPhase>();
1105 RunPrintAndVerify("Late Control reduced"); 1103 RunPrintAndVerify("Late Control reduced");
1106 } else { 1104 } else {
1107 if (info()->is_osr()) { 1105 if (info()->is_osr()) {
1108 Run<OsrDeconstructionPhase>(); 1106 Run<OsrDeconstructionPhase>();
1109 if (info()->bailout_reason() != kNoReason) return Handle<Code>::null(); 1107 if (info()->bailout_reason() != kNoReason) return Handle<Code>::null();
1110 RunPrintAndVerify("OSR deconstruction"); 1108 RunPrintAndVerify("OSR deconstruction", true);
1111 } 1109 }
1112 } 1110 }
1113 1111
1114 // Lower any remaining generic JSOperators. 1112 // Lower any remaining generic JSOperators.
1115 Run<GenericLoweringPhase>(); 1113 Run<GenericLoweringPhase>();
1116 // TODO(jarin, rossberg): Remove UNTYPED once machine typing works. 1114 // TODO(jarin, rossberg): Remove UNTYPED once machine typing works.
1117 RunPrintAndVerify("Lowered generic", true); 1115 RunPrintAndVerify("Lowered generic", true);
1118 1116
1119 Run<LateGraphTrimmingPhase>(); 1117 Run<LateGraphTrimmingPhase>();
1120 // TODO(jarin, rossberg): Remove UNTYPED once machine typing works. 1118 // TODO(jarin, rossberg): Remove UNTYPED once machine typing works.
1121 RunPrintAndVerify("Late trimmed", true); 1119 RunPrintAndVerify("Late trimmed", true);
1122 1120
1123 BeginPhaseKind("block building"); 1121 BeginPhaseKind("block building");
1124 1122
1125 data.source_positions()->RemoveDecorator(); 1123 data.source_positions()->RemoveDecorator();
1126 1124
1125 // Kill the Typer and thereby uninstall the decorator (if any).
1126 typer.Reset(nullptr);
1127
1127 return ScheduleAndGenerateCode( 1128 return ScheduleAndGenerateCode(
1128 Linkage::ComputeIncoming(data.instruction_zone(), info())); 1129 Linkage::ComputeIncoming(data.instruction_zone(), info()));
1129 } 1130 }
1130 1131
1131 1132
1132 Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info, 1133 Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info,
1133 Graph* graph, 1134 Graph* graph,
1134 Schedule* schedule) { 1135 Schedule* schedule) {
1135 CallDescriptor* call_descriptor = 1136 CallDescriptor* call_descriptor =
1136 Linkage::ComputeIncoming(info->zone(), info); 1137 Linkage::ComputeIncoming(info->zone(), info);
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
1360 tcf << AsC1VRegisterAllocationData("CodeGen", 1361 tcf << AsC1VRegisterAllocationData("CodeGen",
1361 data->register_allocation_data()); 1362 data->register_allocation_data());
1362 } 1363 }
1363 1364
1364 data->DeleteRegisterAllocationZone(); 1365 data->DeleteRegisterAllocationZone();
1365 } 1366 }
1366 1367
1367 } // namespace compiler 1368 } // namespace compiler
1368 } // namespace internal 1369 } // namespace internal
1369 } // namespace v8 1370 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/compiler/typer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698