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

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

Issue 665893006: [turbofan] add ZonePool to correctly track compiler phase memory usage (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 2 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 | Annotate | Revision Log
« no previous file with comments | « src/compiler/pipeline.h ('k') | src/compiler/raw-machine-assembler.cc » ('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 <sstream> 7 #include <sstream>
8 8
9 #include "src/base/platform/elapsed-timer.h" 9 #include "src/base/platform/elapsed-timer.h"
10 #include "src/compiler/ast-graph-builder.h" 10 #include "src/compiler/ast-graph-builder.h"
(...skipping 12 matching lines...) Expand all
23 #include "src/compiler/machine-operator-reducer.h" 23 #include "src/compiler/machine-operator-reducer.h"
24 #include "src/compiler/phi-reducer.h" 24 #include "src/compiler/phi-reducer.h"
25 #include "src/compiler/register-allocator.h" 25 #include "src/compiler/register-allocator.h"
26 #include "src/compiler/schedule.h" 26 #include "src/compiler/schedule.h"
27 #include "src/compiler/scheduler.h" 27 #include "src/compiler/scheduler.h"
28 #include "src/compiler/simplified-lowering.h" 28 #include "src/compiler/simplified-lowering.h"
29 #include "src/compiler/simplified-operator-reducer.h" 29 #include "src/compiler/simplified-operator-reducer.h"
30 #include "src/compiler/typer.h" 30 #include "src/compiler/typer.h"
31 #include "src/compiler/value-numbering-reducer.h" 31 #include "src/compiler/value-numbering-reducer.h"
32 #include "src/compiler/verifier.h" 32 #include "src/compiler/verifier.h"
33 #include "src/compiler/zone-pool.h"
33 #include "src/hydrogen.h" 34 #include "src/hydrogen.h"
34 #include "src/ostreams.h" 35 #include "src/ostreams.h"
35 #include "src/utils.h" 36 #include "src/utils.h"
36 37
37 namespace v8 { 38 namespace v8 {
38 namespace internal { 39 namespace internal {
39 namespace compiler { 40 namespace compiler {
40 41
41 class PhaseStats { 42 class PhaseStats {
42 public: 43 public:
43 enum PhaseKind { CREATE_GRAPH, OPTIMIZATION, CODEGEN }; 44 enum PhaseKind { CREATE_GRAPH, OPTIMIZATION, CODEGEN };
44 45
45 PhaseStats(CompilationInfo* info, PhaseKind kind, const char* name) 46 PhaseStats(CompilationInfo* info, ZonePool* zone_pool, PhaseKind kind,
47 const char* name)
46 : info_(info), 48 : info_(info),
49 stats_scope_(zone_pool),
47 kind_(kind), 50 kind_(kind),
48 name_(name), 51 name_(name),
49 size_(info->zone()->allocation_size()) { 52 size_(0) {
50 if (FLAG_turbo_stats) { 53 if (FLAG_turbo_stats) {
51 timer_.Start(); 54 timer_.Start();
55 size_ = info_->zone()->allocation_size();
52 } 56 }
53 } 57 }
54 58
55 ~PhaseStats() { 59 ~PhaseStats() {
56 if (FLAG_turbo_stats) { 60 if (FLAG_turbo_stats) {
57 base::TimeDelta delta = timer_.Elapsed(); 61 base::TimeDelta delta = timer_.Elapsed();
58 size_t bytes = info_->zone()->allocation_size() - size_; 62 size_t bytes = info_->zone()->allocation_size() +
63 stats_scope_.GetMaxAllocatedBytes() - size_;
59 HStatistics* stats = info_->isolate()->GetTStatistics(); 64 HStatistics* stats = info_->isolate()->GetTStatistics();
60 stats->SaveTiming(name_, delta, static_cast<int>(bytes)); 65 stats->SaveTiming(name_, delta, static_cast<int>(bytes));
61 66
62 switch (kind_) { 67 switch (kind_) {
63 case CREATE_GRAPH: 68 case CREATE_GRAPH:
64 stats->IncrementCreateGraph(delta); 69 stats->IncrementCreateGraph(delta);
65 break; 70 break;
66 case OPTIMIZATION: 71 case OPTIMIZATION:
67 stats->IncrementOptimizeGraph(delta); 72 stats->IncrementOptimizeGraph(delta);
68 break; 73 break;
69 case CODEGEN: 74 case CODEGEN:
70 stats->IncrementGenerateCode(delta); 75 stats->IncrementGenerateCode(delta);
71 break; 76 break;
72 } 77 }
73 } 78 }
74 } 79 }
75 80
76 private: 81 private:
77 CompilationInfo* info_; 82 CompilationInfo* info_;
83 ZonePool::StatsScope stats_scope_;
78 PhaseKind kind_; 84 PhaseKind kind_;
79 const char* name_; 85 const char* name_;
80 size_t size_; 86 size_t size_;
81 base::ElapsedTimer timer_; 87 base::ElapsedTimer timer_;
82 }; 88 };
83 89
84 90
85 static inline bool VerifyGraphs() { 91 static inline bool VerifyGraphs() {
86 #ifdef DEBUG 92 #ifdef DEBUG
87 return true; 93 return true;
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 228
223 if (FLAG_trace_turbo) { 229 if (FLAG_trace_turbo) {
224 OFStream os(stdout); 230 OFStream os(stdout);
225 os << "---------------------------------------------------\n" 231 os << "---------------------------------------------------\n"
226 << "Begin compiling method " 232 << "Begin compiling method "
227 << info()->function()->debug_name()->ToCString().get() 233 << info()->function()->debug_name()->ToCString().get()
228 << " using Turbofan" << std::endl; 234 << " using Turbofan" << std::endl;
229 PrintCompilationStart(); 235 PrintCompilationStart();
230 } 236 }
231 237
238 ZonePool zone_pool(isolate());
239
232 // Build the graph. 240 // Build the graph.
233 Graph graph(zone()); 241 Graph graph(zone());
234 SourcePositionTable source_positions(&graph); 242 SourcePositionTable source_positions(&graph);
235 source_positions.AddDecorator(); 243 source_positions.AddDecorator();
236 // TODO(turbofan): there is no need to type anything during initial graph 244 // TODO(turbofan): there is no need to type anything during initial graph
237 // construction. This is currently only needed for the node cache, which the 245 // construction. This is currently only needed for the node cache, which the
238 // typer could sweep over later. 246 // typer could sweep over later.
239 Typer typer(&graph, info()->context()); 247 Typer typer(&graph, info()->context());
240 MachineOperatorBuilder machine; 248 MachineOperatorBuilder machine;
241 CommonOperatorBuilder common(zone()); 249 CommonOperatorBuilder common(zone());
242 JSOperatorBuilder javascript(zone()); 250 JSOperatorBuilder javascript(zone());
243 JSGraph jsgraph(&graph, &common, &javascript, &machine); 251 JSGraph jsgraph(&graph, &common, &javascript, &machine);
244 Node* context_node; 252 Node* context_node;
245 { 253 {
246 PhaseStats graph_builder_stats(info(), PhaseStats::CREATE_GRAPH, 254 PhaseStats graph_builder_stats(info(), &zone_pool, PhaseStats::CREATE_GRAPH,
247 "graph builder"); 255 "graph builder");
248 AstGraphBuilderWithPositions graph_builder(info(), &jsgraph, 256 AstGraphBuilderWithPositions graph_builder(info(), &jsgraph,
249 &source_positions); 257 &source_positions);
250 graph_builder.CreateGraph(); 258 graph_builder.CreateGraph();
251 context_node = graph_builder.GetFunctionContext(); 259 context_node = graph_builder.GetFunctionContext();
252 } 260 }
253 { 261 {
254 PhaseStats phi_reducer_stats(info(), PhaseStats::CREATE_GRAPH, 262 PhaseStats phi_reducer_stats(info(), &zone_pool, PhaseStats::CREATE_GRAPH,
255 "phi reduction"); 263 "phi reduction");
256 PhiReducer phi_reducer; 264 PhiReducer phi_reducer;
257 GraphReducer graph_reducer(&graph); 265 GraphReducer graph_reducer(&graph);
258 graph_reducer.AddReducer(&phi_reducer); 266 graph_reducer.AddReducer(&phi_reducer);
259 graph_reducer.ReduceGraph(); 267 graph_reducer.ReduceGraph();
260 // TODO(mstarzinger): Running reducer once ought to be enough for everyone. 268 // TODO(mstarzinger): Running reducer once ought to be enough for everyone.
261 graph_reducer.ReduceGraph(); 269 graph_reducer.ReduceGraph();
262 graph_reducer.ReduceGraph(); 270 graph_reducer.ReduceGraph();
263 } 271 }
264 272
(...skipping 20 matching lines...) Expand all
285 if (FLAG_print_turbo_replay) { 293 if (FLAG_print_turbo_replay) {
286 GraphReplayPrinter::PrintReplay(&graph); 294 GraphReplayPrinter::PrintReplay(&graph);
287 } 295 }
288 296
289 // Bailout here in case target architecture is not supported. 297 // Bailout here in case target architecture is not supported.
290 if (!SupportedTarget()) return Handle<Code>::null(); 298 if (!SupportedTarget()) return Handle<Code>::null();
291 299
292 if (info()->is_typing_enabled()) { 300 if (info()->is_typing_enabled()) {
293 { 301 {
294 // Type the graph. 302 // Type the graph.
295 PhaseStats typer_stats(info(), PhaseStats::CREATE_GRAPH, "typer"); 303 PhaseStats typer_stats(info(), &zone_pool, PhaseStats::CREATE_GRAPH,
304 "typer");
296 typer.Run(); 305 typer.Run();
297 VerifyAndPrintGraph(&graph, "Typed"); 306 VerifyAndPrintGraph(&graph, "Typed");
298 } 307 }
299 { 308 {
300 // Lower JSOperators where we can determine types. 309 // Lower JSOperators where we can determine types.
301 PhaseStats lowering_stats(info(), PhaseStats::CREATE_GRAPH, 310 PhaseStats lowering_stats(info(), &zone_pool, PhaseStats::CREATE_GRAPH,
302 "typed lowering"); 311 "typed lowering");
303 SourcePositionTable::Scope pos(&source_positions, 312 SourcePositionTable::Scope pos(&source_positions,
304 SourcePosition::Unknown()); 313 SourcePosition::Unknown());
305 ValueNumberingReducer vn_reducer(zone()); 314 ValueNumberingReducer vn_reducer(zone());
306 JSTypedLowering lowering(&jsgraph); 315 JSTypedLowering lowering(&jsgraph);
307 SimplifiedOperatorReducer simple_reducer(&jsgraph); 316 SimplifiedOperatorReducer simple_reducer(&jsgraph);
308 GraphReducer graph_reducer(&graph); 317 GraphReducer graph_reducer(&graph);
309 graph_reducer.AddReducer(&vn_reducer); 318 graph_reducer.AddReducer(&vn_reducer);
310 graph_reducer.AddReducer(&lowering); 319 graph_reducer.AddReducer(&lowering);
311 graph_reducer.AddReducer(&simple_reducer); 320 graph_reducer.AddReducer(&simple_reducer);
312 graph_reducer.ReduceGraph(); 321 graph_reducer.ReduceGraph();
313 322
314 VerifyAndPrintGraph(&graph, "Lowered typed"); 323 VerifyAndPrintGraph(&graph, "Lowered typed");
315 } 324 }
316 { 325 {
317 // Lower simplified operators and insert changes. 326 // Lower simplified operators and insert changes.
318 PhaseStats lowering_stats(info(), PhaseStats::CREATE_GRAPH, 327 PhaseStats lowering_stats(info(), &zone_pool, PhaseStats::CREATE_GRAPH,
319 "simplified lowering"); 328 "simplified lowering");
320 SourcePositionTable::Scope pos(&source_positions, 329 SourcePositionTable::Scope pos(&source_positions,
321 SourcePosition::Unknown()); 330 SourcePosition::Unknown());
322 SimplifiedLowering lowering(&jsgraph); 331 SimplifiedLowering lowering(&jsgraph);
323 lowering.LowerAllNodes(); 332 lowering.LowerAllNodes();
324 ValueNumberingReducer vn_reducer(zone()); 333 ValueNumberingReducer vn_reducer(zone());
325 SimplifiedOperatorReducer simple_reducer(&jsgraph); 334 SimplifiedOperatorReducer simple_reducer(&jsgraph);
326 GraphReducer graph_reducer(&graph); 335 GraphReducer graph_reducer(&graph);
327 graph_reducer.AddReducer(&vn_reducer); 336 graph_reducer.AddReducer(&vn_reducer);
328 graph_reducer.AddReducer(&simple_reducer); 337 graph_reducer.AddReducer(&simple_reducer);
329 graph_reducer.ReduceGraph(); 338 graph_reducer.ReduceGraph();
330 339
331 VerifyAndPrintGraph(&graph, "Lowered simplified"); 340 VerifyAndPrintGraph(&graph, "Lowered simplified");
332 } 341 }
333 { 342 {
334 // Lower changes that have been inserted before. 343 // Lower changes that have been inserted before.
335 PhaseStats lowering_stats(info(), PhaseStats::OPTIMIZATION, 344 PhaseStats lowering_stats(info(), &zone_pool, PhaseStats::OPTIMIZATION,
336 "change lowering"); 345 "change lowering");
337 SourcePositionTable::Scope pos(&source_positions, 346 SourcePositionTable::Scope pos(&source_positions,
338 SourcePosition::Unknown()); 347 SourcePosition::Unknown());
339 Linkage linkage(info()); 348 Linkage linkage(info());
340 ValueNumberingReducer vn_reducer(zone()); 349 ValueNumberingReducer vn_reducer(zone());
341 SimplifiedOperatorReducer simple_reducer(&jsgraph); 350 SimplifiedOperatorReducer simple_reducer(&jsgraph);
342 ChangeLowering lowering(&jsgraph, &linkage); 351 ChangeLowering lowering(&jsgraph, &linkage);
343 MachineOperatorReducer mach_reducer(&jsgraph); 352 MachineOperatorReducer mach_reducer(&jsgraph);
344 GraphReducer graph_reducer(&graph); 353 GraphReducer graph_reducer(&graph);
345 // TODO(titzer): Figure out if we should run all reducers at once here. 354 // TODO(titzer): Figure out if we should run all reducers at once here.
346 graph_reducer.AddReducer(&vn_reducer); 355 graph_reducer.AddReducer(&vn_reducer);
347 graph_reducer.AddReducer(&simple_reducer); 356 graph_reducer.AddReducer(&simple_reducer);
348 graph_reducer.AddReducer(&lowering); 357 graph_reducer.AddReducer(&lowering);
349 graph_reducer.AddReducer(&mach_reducer); 358 graph_reducer.AddReducer(&mach_reducer);
350 graph_reducer.ReduceGraph(); 359 graph_reducer.ReduceGraph();
351 360
352 // TODO(jarin, rossberg): Remove UNTYPED once machine typing works. 361 // TODO(jarin, rossberg): Remove UNTYPED once machine typing works.
353 VerifyAndPrintGraph(&graph, "Lowered changes", true); 362 VerifyAndPrintGraph(&graph, "Lowered changes", true);
354 } 363 }
355 364
356 { 365 {
357 SourcePositionTable::Scope pos(&source_positions, 366 SourcePositionTable::Scope pos(&source_positions,
358 SourcePosition::Unknown()); 367 SourcePosition::Unknown());
359 PhaseStats control_reducer_stats(info(), PhaseStats::CREATE_GRAPH, 368 PhaseStats control_reducer_stats(
360 "control reduction"); 369 info(), &zone_pool, PhaseStats::CREATE_GRAPH, "control reduction");
361 ControlReducer::ReduceGraph(&jsgraph, &common); 370 ControlReducer::ReduceGraph(&jsgraph, &common);
362 371
363 VerifyAndPrintGraph(&graph, "Control reduced"); 372 VerifyAndPrintGraph(&graph, "Control reduced");
364 } 373 }
365 } 374 }
366 375
367 { 376 {
368 // Lower any remaining generic JSOperators. 377 // Lower any remaining generic JSOperators.
369 PhaseStats lowering_stats(info(), PhaseStats::CREATE_GRAPH, 378 PhaseStats lowering_stats(info(), &zone_pool, PhaseStats::CREATE_GRAPH,
370 "generic lowering"); 379 "generic lowering");
371 SourcePositionTable::Scope pos(&source_positions, 380 SourcePositionTable::Scope pos(&source_positions,
372 SourcePosition::Unknown()); 381 SourcePosition::Unknown());
373 JSGenericLowering lowering(info(), &jsgraph); 382 JSGenericLowering lowering(info(), &jsgraph);
374 GraphReducer graph_reducer(&graph); 383 GraphReducer graph_reducer(&graph);
375 graph_reducer.AddReducer(&lowering); 384 graph_reducer.AddReducer(&lowering);
376 graph_reducer.ReduceGraph(); 385 graph_reducer.ReduceGraph();
377 386
378 // TODO(jarin, rossberg): Remove UNTYPED once machine typing works. 387 // TODO(jarin, rossberg): Remove UNTYPED once machine typing works.
379 VerifyAndPrintGraph(&graph, "Lowered generic", true); 388 VerifyAndPrintGraph(&graph, "Lowered generic", true);
380 } 389 }
381 390
382 source_positions.RemoveDecorator(); 391 source_positions.RemoveDecorator();
383 392
384 Handle<Code> code = Handle<Code>::null(); 393 Handle<Code> code = Handle<Code>::null();
385 { 394 {
386 // Compute a schedule. 395 // Compute a schedule.
387 Schedule* schedule = ComputeSchedule(&graph); 396 Schedule* schedule = ComputeSchedule(&zone_pool, &graph);
388 // Generate optimized code. 397 // Generate optimized code.
389 PhaseStats codegen_stats(info(), PhaseStats::CODEGEN, "codegen"); 398 PhaseStats codegen_stats(info(), &zone_pool, PhaseStats::CODEGEN,
399 "codegen");
390 Linkage linkage(info()); 400 Linkage linkage(info());
391 code = GenerateCode(&linkage, &graph, schedule, &source_positions); 401 code = GenerateCode(&linkage, &graph, schedule, &source_positions);
392 info()->SetCode(code); 402 info()->SetCode(code);
393 } 403 }
394 404
395 // Print optimized code. 405 // Print optimized code.
396 v8::internal::CodeGenerator::PrintCode(code, info()); 406 v8::internal::CodeGenerator::PrintCode(code, info());
397 407
398 if (FLAG_trace_turbo) { 408 if (FLAG_trace_turbo) {
399 OFStream os(stdout); 409 OFStream os(stdout);
400 os << "--------------------------------------------------\n" 410 os << "--------------------------------------------------\n"
401 << "Finished compiling method " 411 << "Finished compiling method "
402 << info()->function()->debug_name()->ToCString().get() 412 << info()->function()->debug_name()->ToCString().get()
403 << " using Turbofan" << std::endl; 413 << " using Turbofan" << std::endl;
404 } 414 }
405 415
406 return code; 416 return code;
407 } 417 }
408 418
409 419
410 Schedule* Pipeline::ComputeSchedule(Graph* graph) { 420 Schedule* Pipeline::ComputeSchedule(ZonePool* zone_pool, Graph* graph) {
411 PhaseStats schedule_stats(info(), PhaseStats::CODEGEN, "scheduling"); 421 PhaseStats schedule_stats(info(), zone_pool, PhaseStats::CODEGEN,
412 Schedule* schedule = Scheduler::ComputeSchedule(graph); 422 "scheduling");
423 Schedule* schedule = Scheduler::ComputeSchedule(zone_pool, graph);
413 TraceSchedule(schedule); 424 TraceSchedule(schedule);
414 if (VerifyGraphs()) ScheduleVerifier::Run(schedule); 425 if (VerifyGraphs()) ScheduleVerifier::Run(schedule);
415 return schedule; 426 return schedule;
416 } 427 }
417 428
418 429
419 Handle<Code> Pipeline::GenerateCodeForMachineGraph(Linkage* linkage, 430 Handle<Code> Pipeline::GenerateCodeForMachineGraph(Linkage* linkage,
420 Graph* graph, 431 Graph* graph,
421 Schedule* schedule) { 432 Schedule* schedule) {
422 CHECK(SupportedBackend()); 433 CHECK(SupportedBackend());
423 if (schedule == NULL) { 434 if (schedule == NULL) {
424 // TODO(rossberg): Should this really be untyped? 435 // TODO(rossberg): Should this really be untyped?
425 VerifyAndPrintGraph(graph, "Machine", true); 436 VerifyAndPrintGraph(graph, "Machine", true);
426 schedule = ComputeSchedule(graph); 437 ZonePool zone_pool(isolate());
438 schedule = ComputeSchedule(&zone_pool, graph);
427 } 439 }
428 TraceSchedule(schedule); 440 TraceSchedule(schedule);
429 441
430 SourcePositionTable source_positions(graph); 442 SourcePositionTable source_positions(graph);
431 Handle<Code> code = GenerateCode(linkage, graph, schedule, &source_positions); 443 Handle<Code> code = GenerateCode(linkage, graph, schedule, &source_positions);
432 #if ENABLE_DISASSEMBLER 444 #if ENABLE_DISASSEMBLER
433 if (!code.is_null() && FLAG_print_opt_code) { 445 if (!code.is_null() && FLAG_print_opt_code) {
434 CodeTracer::Scope tracing_scope(isolate()->GetCodeTracer()); 446 CodeTracer::Scope tracing_scope(isolate()->GetCodeTracer());
435 OFStream os(tracing_scope.file()); 447 OFStream os(tracing_scope.file());
436 code->Disassemble("test code", os); 448 code->Disassemble("test code", os);
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
514 } 526 }
515 527
516 528
517 void Pipeline::TearDown() { 529 void Pipeline::TearDown() {
518 InstructionOperand::TearDownCaches(); 530 InstructionOperand::TearDownCaches();
519 } 531 }
520 532
521 } // namespace compiler 533 } // namespace compiler
522 } // namespace internal 534 } // namespace internal
523 } // namespace v8 535 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/pipeline.h ('k') | src/compiler/raw-machine-assembler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698