| OLD | NEW |
| 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/platform/elapsed-timer.h" | 10 #include "src/base/platform/elapsed-timer.h" |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 } | 283 } |
| 284 | 284 |
| 285 | 285 |
| 286 class AstGraphBuilderWithPositions : public AstGraphBuilder { | 286 class AstGraphBuilderWithPositions : public AstGraphBuilder { |
| 287 public: | 287 public: |
| 288 AstGraphBuilderWithPositions(Zone* local_zone, CompilationInfo* info, | 288 AstGraphBuilderWithPositions(Zone* local_zone, CompilationInfo* info, |
| 289 JSGraph* jsgraph, | 289 JSGraph* jsgraph, |
| 290 LoopAssignmentAnalysis* loop_assignment, | 290 LoopAssignmentAnalysis* loop_assignment, |
| 291 SourcePositionTable* source_positions) | 291 SourcePositionTable* source_positions) |
| 292 : AstGraphBuilder(local_zone, info, jsgraph, loop_assignment), | 292 : AstGraphBuilder(local_zone, info, jsgraph, loop_assignment), |
| 293 source_positions_(source_positions) {} | 293 source_positions_(source_positions), |
| 294 start_position_(info->shared_info()->start_position()) {} |
| 294 | 295 |
| 295 bool CreateGraph() { | 296 bool CreateGraph() { |
| 296 SourcePositionTable::Scope pos(source_positions_, | 297 SourcePositionTable::Scope pos_scope(source_positions_, start_position_); |
| 297 SourcePosition::Unknown()); | |
| 298 return AstGraphBuilder::CreateGraph(); | 298 return AstGraphBuilder::CreateGraph(); |
| 299 } | 299 } |
| 300 | 300 |
| 301 #define DEF_VISIT(type) \ | 301 #define DEF_VISIT(type) \ |
| 302 void Visit##type(type* node) OVERRIDE { \ | 302 void Visit##type(type* node) OVERRIDE { \ |
| 303 SourcePositionTable::Scope pos(source_positions_, \ | 303 SourcePositionTable::Scope pos(source_positions_, \ |
| 304 SourcePosition(node->position())); \ | 304 SourcePosition(node->position())); \ |
| 305 AstGraphBuilder::Visit##type(node); \ | 305 AstGraphBuilder::Visit##type(node); \ |
| 306 } | 306 } |
| 307 AST_NODE_LIST(DEF_VISIT) | 307 AST_NODE_LIST(DEF_VISIT) |
| 308 #undef DEF_VISIT | 308 #undef DEF_VISIT |
| 309 | 309 |
| 310 Node* GetFunctionContext() { return AstGraphBuilder::GetFunctionContext(); } | 310 Node* GetFunctionContext() { return AstGraphBuilder::GetFunctionContext(); } |
| 311 | 311 |
| 312 private: | 312 private: |
| 313 SourcePositionTable* source_positions_; | 313 SourcePositionTable* source_positions_; |
| 314 SourcePosition start_position_; |
| 314 }; | 315 }; |
| 315 | 316 |
| 316 | 317 |
| 318 namespace { |
| 319 |
| 320 class SourcePositionWrapper : public Reducer { |
| 321 public: |
| 322 SourcePositionWrapper(Reducer* reducer, SourcePositionTable* table) |
| 323 : reducer_(reducer), table_(table) {} |
| 324 virtual ~SourcePositionWrapper() {} |
| 325 |
| 326 virtual Reduction Reduce(Node* node) { |
| 327 SourcePosition pos = table_->GetSourcePosition(node); |
| 328 SourcePositionTable::Scope position(table_, pos); |
| 329 return reducer_->Reduce(node); |
| 330 } |
| 331 |
| 332 private: |
| 333 Reducer* reducer_; |
| 334 SourcePositionTable* table_; |
| 335 |
| 336 DISALLOW_COPY_AND_ASSIGN(SourcePositionWrapper); |
| 337 }; |
| 338 |
| 339 |
| 340 static void AddReducer(PipelineData* data, GraphReducer* graph_reducer, |
| 341 Reducer* reducer) { |
| 342 if (FLAG_turbo_source_positions) { |
| 343 void* buffer = data->graph_zone()->New(sizeof(SourcePositionWrapper)); |
| 344 SourcePositionWrapper* wrapper = |
| 345 new (buffer) SourcePositionWrapper(reducer, data->source_positions()); |
| 346 graph_reducer->AddReducer(wrapper); |
| 347 } else { |
| 348 graph_reducer->AddReducer(reducer); |
| 349 } |
| 350 } |
| 351 } // namespace |
| 352 |
| 317 class PipelineRunScope { | 353 class PipelineRunScope { |
| 318 public: | 354 public: |
| 319 PipelineRunScope(PipelineData* data, const char* phase_name) | 355 PipelineRunScope(PipelineData* data, const char* phase_name) |
| 320 : phase_scope_( | 356 : phase_scope_( |
| 321 phase_name == nullptr ? nullptr : data->pipeline_statistics(), | 357 phase_name == nullptr ? nullptr : data->pipeline_statistics(), |
| 322 phase_name), | 358 phase_name), |
| 323 zone_scope_(data->zone_pool()) {} | 359 zone_scope_(data->zone_pool()) {} |
| 324 | 360 |
| 325 Zone* zone() { return zone_scope_.zone(); } | 361 Zone* zone() { return zone_scope_.zone(); } |
| 326 | 362 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 375 | 411 |
| 376 struct ContextSpecializerPhase { | 412 struct ContextSpecializerPhase { |
| 377 static const char* phase_name() { return "context specializing"; } | 413 static const char* phase_name() { return "context specializing"; } |
| 378 | 414 |
| 379 void Run(PipelineData* data, Zone* temp_zone) { | 415 void Run(PipelineData* data, Zone* temp_zone) { |
| 380 SourcePositionTable::Scope pos(data->source_positions(), | 416 SourcePositionTable::Scope pos(data->source_positions(), |
| 381 SourcePosition::Unknown()); | 417 SourcePosition::Unknown()); |
| 382 JSContextSpecializer spec(data->info(), data->jsgraph(), | 418 JSContextSpecializer spec(data->info(), data->jsgraph(), |
| 383 data->context_node()); | 419 data->context_node()); |
| 384 GraphReducer graph_reducer(data->graph(), temp_zone); | 420 GraphReducer graph_reducer(data->graph(), temp_zone); |
| 385 graph_reducer.AddReducer(&spec); | 421 AddReducer(data, &graph_reducer, &spec); |
| 386 graph_reducer.ReduceGraph(); | 422 graph_reducer.ReduceGraph(); |
| 387 } | 423 } |
| 388 }; | 424 }; |
| 389 | 425 |
| 390 | 426 |
| 391 struct InliningPhase { | 427 struct InliningPhase { |
| 392 static const char* phase_name() { return "inlining"; } | 428 static const char* phase_name() { return "inlining"; } |
| 393 | 429 |
| 394 void Run(PipelineData* data, Zone* temp_zone) { | 430 void Run(PipelineData* data, Zone* temp_zone) { |
| 395 SourcePositionTable::Scope pos(data->source_positions(), | 431 SourcePositionTable::Scope pos(data->source_positions(), |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 428 SourcePositionTable::Scope pos(data->source_positions(), | 464 SourcePositionTable::Scope pos(data->source_positions(), |
| 429 SourcePosition::Unknown()); | 465 SourcePosition::Unknown()); |
| 430 ValueNumberingReducer vn_reducer(temp_zone); | 466 ValueNumberingReducer vn_reducer(temp_zone); |
| 431 LoadElimination load_elimination; | 467 LoadElimination load_elimination; |
| 432 JSBuiltinReducer builtin_reducer(data->jsgraph()); | 468 JSBuiltinReducer builtin_reducer(data->jsgraph()); |
| 433 JSTypedLowering typed_lowering(data->jsgraph(), temp_zone); | 469 JSTypedLowering typed_lowering(data->jsgraph(), temp_zone); |
| 434 JSIntrinsicLowering intrinsic_lowering(data->jsgraph()); | 470 JSIntrinsicLowering intrinsic_lowering(data->jsgraph()); |
| 435 SimplifiedOperatorReducer simple_reducer(data->jsgraph()); | 471 SimplifiedOperatorReducer simple_reducer(data->jsgraph()); |
| 436 CommonOperatorReducer common_reducer; | 472 CommonOperatorReducer common_reducer; |
| 437 GraphReducer graph_reducer(data->graph(), temp_zone); | 473 GraphReducer graph_reducer(data->graph(), temp_zone); |
| 438 graph_reducer.AddReducer(&vn_reducer); | 474 AddReducer(data, &graph_reducer, &vn_reducer); |
| 439 graph_reducer.AddReducer(&builtin_reducer); | 475 AddReducer(data, &graph_reducer, &builtin_reducer); |
| 440 graph_reducer.AddReducer(&typed_lowering); | 476 AddReducer(data, &graph_reducer, &typed_lowering); |
| 441 graph_reducer.AddReducer(&intrinsic_lowering); | 477 AddReducer(data, &graph_reducer, &intrinsic_lowering); |
| 442 graph_reducer.AddReducer(&load_elimination); | 478 AddReducer(data, &graph_reducer, &load_elimination); |
| 443 graph_reducer.AddReducer(&simple_reducer); | 479 AddReducer(data, &graph_reducer, &simple_reducer); |
| 444 graph_reducer.AddReducer(&common_reducer); | 480 AddReducer(data, &graph_reducer, &common_reducer); |
| 445 graph_reducer.ReduceGraph(); | 481 graph_reducer.ReduceGraph(); |
| 446 } | 482 } |
| 447 }; | 483 }; |
| 448 | 484 |
| 449 | 485 |
| 450 struct SimplifiedLoweringPhase { | 486 struct SimplifiedLoweringPhase { |
| 451 static const char* phase_name() { return "simplified lowering"; } | 487 static const char* phase_name() { return "simplified lowering"; } |
| 452 | 488 |
| 453 void Run(PipelineData* data, Zone* temp_zone) { | 489 void Run(PipelineData* data, Zone* temp_zone) { |
| 454 SourcePositionTable::Scope pos(data->source_positions(), | 490 SourcePositionTable::Scope pos(data->source_positions(), |
| 455 SourcePosition::Unknown()); | 491 SourcePosition::Unknown()); |
| 456 SimplifiedLowering lowering(data->jsgraph(), temp_zone); | 492 SimplifiedLowering lowering(data->jsgraph(), temp_zone, |
| 493 data->source_positions()); |
| 457 lowering.LowerAllNodes(); | 494 lowering.LowerAllNodes(); |
| 458 ValueNumberingReducer vn_reducer(temp_zone); | 495 ValueNumberingReducer vn_reducer(temp_zone); |
| 459 SimplifiedOperatorReducer simple_reducer(data->jsgraph()); | 496 SimplifiedOperatorReducer simple_reducer(data->jsgraph()); |
| 460 MachineOperatorReducer machine_reducer(data->jsgraph()); | 497 MachineOperatorReducer machine_reducer(data->jsgraph()); |
| 461 CommonOperatorReducer common_reducer; | 498 CommonOperatorReducer common_reducer; |
| 462 GraphReducer graph_reducer(data->graph(), temp_zone); | 499 GraphReducer graph_reducer(data->graph(), temp_zone); |
| 463 graph_reducer.AddReducer(&vn_reducer); | 500 AddReducer(data, &graph_reducer, &vn_reducer); |
| 464 graph_reducer.AddReducer(&simple_reducer); | 501 AddReducer(data, &graph_reducer, &simple_reducer); |
| 465 graph_reducer.AddReducer(&machine_reducer); | 502 AddReducer(data, &graph_reducer, &machine_reducer); |
| 466 graph_reducer.AddReducer(&common_reducer); | 503 AddReducer(data, &graph_reducer, &common_reducer); |
| 467 graph_reducer.ReduceGraph(); | 504 graph_reducer.ReduceGraph(); |
| 468 } | 505 } |
| 469 }; | 506 }; |
| 470 | 507 |
| 471 | 508 |
| 472 struct ChangeLoweringPhase { | 509 struct ChangeLoweringPhase { |
| 473 static const char* phase_name() { return "change lowering"; } | 510 static const char* phase_name() { return "change lowering"; } |
| 474 | 511 |
| 475 void Run(PipelineData* data, Zone* temp_zone) { | 512 void Run(PipelineData* data, Zone* temp_zone) { |
| 476 SourcePositionTable::Scope pos(data->source_positions(), | 513 SourcePositionTable::Scope pos(data->source_positions(), |
| 477 SourcePosition::Unknown()); | 514 SourcePosition::Unknown()); |
| 478 Linkage linkage(data->graph_zone(), data->info()); | 515 Linkage linkage(data->graph_zone(), data->info()); |
| 479 ValueNumberingReducer vn_reducer(temp_zone); | 516 ValueNumberingReducer vn_reducer(temp_zone); |
| 480 SimplifiedOperatorReducer simple_reducer(data->jsgraph()); | 517 SimplifiedOperatorReducer simple_reducer(data->jsgraph()); |
| 481 ChangeLowering lowering(data->jsgraph(), &linkage); | 518 ChangeLowering lowering(data->jsgraph(), &linkage); |
| 482 MachineOperatorReducer machine_reducer(data->jsgraph()); | 519 MachineOperatorReducer machine_reducer(data->jsgraph()); |
| 483 CommonOperatorReducer common_reducer; | 520 CommonOperatorReducer common_reducer; |
| 484 GraphReducer graph_reducer(data->graph(), temp_zone); | 521 GraphReducer graph_reducer(data->graph(), temp_zone); |
| 485 graph_reducer.AddReducer(&vn_reducer); | 522 graph_reducer.AddReducer(&vn_reducer); |
| 486 graph_reducer.AddReducer(&simple_reducer); | 523 AddReducer(data, &graph_reducer, &simple_reducer); |
| 487 graph_reducer.AddReducer(&lowering); | 524 AddReducer(data, &graph_reducer, &lowering); |
| 488 graph_reducer.AddReducer(&machine_reducer); | 525 AddReducer(data, &graph_reducer, &machine_reducer); |
| 489 graph_reducer.AddReducer(&common_reducer); | 526 AddReducer(data, &graph_reducer, &common_reducer); |
| 490 graph_reducer.ReduceGraph(); | 527 graph_reducer.ReduceGraph(); |
| 491 } | 528 } |
| 492 }; | 529 }; |
| 493 | 530 |
| 494 | 531 |
| 495 struct ControlReductionPhase { | 532 struct ControlReductionPhase { |
| 496 void Run(PipelineData* data, Zone* temp_zone) { | 533 void Run(PipelineData* data, Zone* temp_zone) { |
| 497 SourcePositionTable::Scope pos(data->source_positions(), | 534 SourcePositionTable::Scope pos(data->source_positions(), |
| 498 SourcePosition::Unknown()); | 535 SourcePosition::Unknown()); |
| 499 ControlReducer::ReduceGraph(temp_zone, data->jsgraph(), data->common()); | 536 ControlReducer::ReduceGraph(temp_zone, data->jsgraph(), data->common()); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 530 | 567 |
| 531 struct GenericLoweringPhase { | 568 struct GenericLoweringPhase { |
| 532 static const char* phase_name() { return "generic lowering"; } | 569 static const char* phase_name() { return "generic lowering"; } |
| 533 | 570 |
| 534 void Run(PipelineData* data, Zone* temp_zone) { | 571 void Run(PipelineData* data, Zone* temp_zone) { |
| 535 SourcePositionTable::Scope pos(data->source_positions(), | 572 SourcePositionTable::Scope pos(data->source_positions(), |
| 536 SourcePosition::Unknown()); | 573 SourcePosition::Unknown()); |
| 537 JSGenericLowering generic(data->info(), data->jsgraph()); | 574 JSGenericLowering generic(data->info(), data->jsgraph()); |
| 538 SelectLowering select(data->jsgraph()->graph(), data->jsgraph()->common()); | 575 SelectLowering select(data->jsgraph()->graph(), data->jsgraph()->common()); |
| 539 GraphReducer graph_reducer(data->graph(), temp_zone); | 576 GraphReducer graph_reducer(data->graph(), temp_zone); |
| 540 graph_reducer.AddReducer(&generic); | 577 AddReducer(data, &graph_reducer, &generic); |
| 541 graph_reducer.AddReducer(&select); | 578 AddReducer(data, &graph_reducer, &select); |
| 542 graph_reducer.ReduceGraph(); | 579 graph_reducer.ReduceGraph(); |
| 543 } | 580 } |
| 544 }; | 581 }; |
| 545 | 582 |
| 546 | 583 |
| 547 struct ComputeSchedulePhase { | 584 struct ComputeSchedulePhase { |
| 548 static const char* phase_name() { return "scheduling"; } | 585 static const char* phase_name() { return "scheduling"; } |
| 549 | 586 |
| 550 void Run(PipelineData* data, Zone* temp_zone) { | 587 void Run(PipelineData* data, Zone* temp_zone) { |
| 551 Schedule* schedule = Scheduler::ComputeSchedule( | 588 Schedule* schedule = Scheduler::ComputeSchedule( |
| (...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1143 } | 1180 } |
| 1144 | 1181 |
| 1145 | 1182 |
| 1146 void Pipeline::TearDown() { | 1183 void Pipeline::TearDown() { |
| 1147 InstructionOperand::TearDownCaches(); | 1184 InstructionOperand::TearDownCaches(); |
| 1148 } | 1185 } |
| 1149 | 1186 |
| 1150 } // namespace compiler | 1187 } // namespace compiler |
| 1151 } // namespace internal | 1188 } // namespace internal |
| 1152 } // namespace v8 | 1189 } // namespace v8 |
| OLD | NEW |