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/adapters.h" | 10 #include "src/base/adapters.h" |
(...skipping 392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
403 } | 403 } |
404 | 404 |
405 private: | 405 private: |
406 Reducer* const reducer_; | 406 Reducer* const reducer_; |
407 SourcePositionTable* const table_; | 407 SourcePositionTable* const table_; |
408 | 408 |
409 DISALLOW_COPY_AND_ASSIGN(SourcePositionWrapper); | 409 DISALLOW_COPY_AND_ASSIGN(SourcePositionWrapper); |
410 }; | 410 }; |
411 | 411 |
412 | 412 |
| 413 class JSGraphReducer final : public GraphReducer { |
| 414 public: |
| 415 JSGraphReducer(JSGraph* jsgraph, Zone* zone) |
| 416 : GraphReducer(zone, jsgraph->graph(), jsgraph->TheHoleConstant(), |
| 417 jsgraph->DeadControl()) {} |
| 418 ~JSGraphReducer() final {} |
| 419 }; |
| 420 |
| 421 |
413 void AddReducer(PipelineData* data, GraphReducer* graph_reducer, | 422 void AddReducer(PipelineData* data, GraphReducer* graph_reducer, |
414 Reducer* reducer) { | 423 Reducer* reducer) { |
415 if (data->info()->is_source_positions_enabled()) { | 424 if (data->info()->is_source_positions_enabled()) { |
416 void* const buffer = data->graph_zone()->New(sizeof(SourcePositionWrapper)); | 425 void* const buffer = data->graph_zone()->New(sizeof(SourcePositionWrapper)); |
417 SourcePositionWrapper* const wrapper = | 426 SourcePositionWrapper* const wrapper = |
418 new (buffer) SourcePositionWrapper(reducer, data->source_positions()); | 427 new (buffer) SourcePositionWrapper(reducer, data->source_positions()); |
419 graph_reducer->AddReducer(wrapper); | 428 graph_reducer->AddReducer(wrapper); |
420 } else { | 429 } else { |
421 graph_reducer->AddReducer(reducer); | 430 graph_reducer->AddReducer(reducer); |
422 } | 431 } |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
481 } | 490 } |
482 } | 491 } |
483 }; | 492 }; |
484 | 493 |
485 | 494 |
486 struct ContextSpecializerPhase { | 495 struct ContextSpecializerPhase { |
487 static const char* phase_name() { return "context specializing"; } | 496 static const char* phase_name() { return "context specializing"; } |
488 | 497 |
489 void Run(PipelineData* data, Zone* temp_zone) { | 498 void Run(PipelineData* data, Zone* temp_zone) { |
490 JSContextSpecializer spec(data->jsgraph()); | 499 JSContextSpecializer spec(data->jsgraph()); |
491 GraphReducer graph_reducer(data->graph(), temp_zone); | 500 JSGraphReducer graph_reducer(data->jsgraph(), temp_zone); |
492 AddReducer(data, &graph_reducer, &spec); | 501 AddReducer(data, &graph_reducer, &spec); |
493 graph_reducer.ReduceGraph(); | 502 graph_reducer.ReduceGraph(); |
494 } | 503 } |
495 }; | 504 }; |
496 | 505 |
497 | 506 |
498 struct InliningPhase { | 507 struct InliningPhase { |
499 static const char* phase_name() { return "inlining"; } | 508 static const char* phase_name() { return "inlining"; } |
500 | 509 |
501 void Run(PipelineData* data, Zone* temp_zone) { | 510 void Run(PipelineData* data, Zone* temp_zone) { |
502 GraphReducer graph_reducer(data->graph(), temp_zone); | 511 JSGraphReducer graph_reducer(data->jsgraph(), temp_zone); |
503 JSInliner inliner(&graph_reducer, data->info()->is_inlining_enabled() | 512 JSInliner inliner(&graph_reducer, data->info()->is_inlining_enabled() |
504 ? JSInliner::kGeneralInlining | 513 ? JSInliner::kGeneralInlining |
505 : JSInliner::kRestrictedInlining, | 514 : JSInliner::kRestrictedInlining, |
506 temp_zone, data->info(), data->jsgraph()); | 515 temp_zone, data->info(), data->jsgraph()); |
507 AddReducer(data, &graph_reducer, &inliner); | 516 AddReducer(data, &graph_reducer, &inliner); |
508 graph_reducer.ReduceGraph(); | 517 graph_reducer.ReduceGraph(); |
509 } | 518 } |
510 }; | 519 }; |
511 | 520 |
512 | 521 |
(...skipping 15 matching lines...) Expand all Loading... |
528 | 537 |
529 | 538 |
530 struct JSTypeFeedbackPhase { | 539 struct JSTypeFeedbackPhase { |
531 static const char* phase_name() { return "type feedback specializing"; } | 540 static const char* phase_name() { return "type feedback specializing"; } |
532 | 541 |
533 void Run(PipelineData* data, Zone* temp_zone) { | 542 void Run(PipelineData* data, Zone* temp_zone) { |
534 Handle<Context> native_context(data->info()->context()->native_context()); | 543 Handle<Context> native_context(data->info()->context()->native_context()); |
535 TypeFeedbackOracle oracle(data->isolate(), temp_zone, | 544 TypeFeedbackOracle oracle(data->isolate(), temp_zone, |
536 data->info()->unoptimized_code(), | 545 data->info()->unoptimized_code(), |
537 data->info()->feedback_vector(), native_context); | 546 data->info()->feedback_vector(), native_context); |
538 GraphReducer graph_reducer(data->graph(), temp_zone); | 547 JSGraphReducer graph_reducer(data->jsgraph(), temp_zone); |
539 Handle<GlobalObject> global_object = Handle<GlobalObject>::null(); | 548 Handle<GlobalObject> global_object = Handle<GlobalObject>::null(); |
540 if (data->info()->has_global_object()) { | 549 if (data->info()->has_global_object()) { |
541 global_object = | 550 global_object = |
542 Handle<GlobalObject>(data->info()->global_object(), data->isolate()); | 551 Handle<GlobalObject>(data->info()->global_object(), data->isolate()); |
543 } | 552 } |
544 // TODO(titzer): introduce a specialization mode/flags enum to control | 553 // TODO(titzer): introduce a specialization mode/flags enum to control |
545 // specializing to the global object here. | 554 // specializing to the global object here. |
546 JSTypeFeedbackSpecializer specializer( | 555 JSTypeFeedbackSpecializer specializer( |
547 &graph_reducer, data->jsgraph(), data->js_type_feedback(), &oracle, | 556 &graph_reducer, data->jsgraph(), data->js_type_feedback(), &oracle, |
548 global_object, data->info()->is_deoptimization_enabled() | 557 global_object, data->info()->is_deoptimization_enabled() |
549 ? JSTypeFeedbackSpecializer::kDeoptimizationEnabled | 558 ? JSTypeFeedbackSpecializer::kDeoptimizationEnabled |
550 : JSTypeFeedbackSpecializer::kDeoptimizationDisabled, | 559 : JSTypeFeedbackSpecializer::kDeoptimizationDisabled, |
551 data->info()->dependencies()); | 560 data->info()->dependencies()); |
552 AddReducer(data, &graph_reducer, &specializer); | 561 AddReducer(data, &graph_reducer, &specializer); |
553 graph_reducer.ReduceGraph(); | 562 graph_reducer.ReduceGraph(); |
554 } | 563 } |
555 }; | 564 }; |
556 | 565 |
557 | 566 |
558 struct TypedLoweringPhase { | 567 struct TypedLoweringPhase { |
559 static const char* phase_name() { return "typed lowering"; } | 568 static const char* phase_name() { return "typed lowering"; } |
560 | 569 |
561 void Run(PipelineData* data, Zone* temp_zone) { | 570 void Run(PipelineData* data, Zone* temp_zone) { |
562 GraphReducer graph_reducer(data->graph(), temp_zone); | 571 JSGraphReducer graph_reducer(data->jsgraph(), temp_zone); |
563 LoadElimination load_elimination; | 572 LoadElimination load_elimination; |
564 JSBuiltinReducer builtin_reducer(data->jsgraph()); | 573 JSBuiltinReducer builtin_reducer(data->jsgraph()); |
565 JSTypedLowering typed_lowering(&graph_reducer, data->jsgraph(), temp_zone); | 574 JSTypedLowering typed_lowering(&graph_reducer, data->jsgraph(), temp_zone); |
566 JSIntrinsicLowering intrinsic_lowering( | 575 JSIntrinsicLowering intrinsic_lowering( |
567 &graph_reducer, data->jsgraph(), | 576 &graph_reducer, data->jsgraph(), |
568 data->info()->is_deoptimization_enabled() | 577 data->info()->is_deoptimization_enabled() |
569 ? JSIntrinsicLowering::kDeoptimizationEnabled | 578 ? JSIntrinsicLowering::kDeoptimizationEnabled |
570 : JSIntrinsicLowering::kDeoptimizationDisabled); | 579 : JSIntrinsicLowering::kDeoptimizationDisabled); |
571 CommonOperatorReducer common_reducer(data->jsgraph()); | 580 CommonOperatorReducer common_reducer(data->jsgraph()); |
572 AddReducer(data, &graph_reducer, &builtin_reducer); | 581 AddReducer(data, &graph_reducer, &builtin_reducer); |
573 AddReducer(data, &graph_reducer, &typed_lowering); | 582 AddReducer(data, &graph_reducer, &typed_lowering); |
574 AddReducer(data, &graph_reducer, &intrinsic_lowering); | 583 AddReducer(data, &graph_reducer, &intrinsic_lowering); |
575 AddReducer(data, &graph_reducer, &load_elimination); | 584 AddReducer(data, &graph_reducer, &load_elimination); |
576 AddReducer(data, &graph_reducer, &common_reducer); | 585 AddReducer(data, &graph_reducer, &common_reducer); |
577 graph_reducer.ReduceGraph(); | 586 graph_reducer.ReduceGraph(); |
578 } | 587 } |
579 }; | 588 }; |
580 | 589 |
581 | 590 |
582 struct SimplifiedLoweringPhase { | 591 struct SimplifiedLoweringPhase { |
583 static const char* phase_name() { return "simplified lowering"; } | 592 static const char* phase_name() { return "simplified lowering"; } |
584 | 593 |
585 void Run(PipelineData* data, Zone* temp_zone) { | 594 void Run(PipelineData* data, Zone* temp_zone) { |
586 SimplifiedLowering lowering(data->jsgraph(), temp_zone, | 595 SimplifiedLowering lowering(data->jsgraph(), temp_zone, |
587 data->source_positions()); | 596 data->source_positions()); |
588 lowering.LowerAllNodes(); | 597 lowering.LowerAllNodes(); |
589 ValueNumberingReducer vn_reducer(temp_zone); | 598 ValueNumberingReducer vn_reducer(temp_zone); |
590 MachineOperatorReducer machine_reducer(data->jsgraph()); | 599 MachineOperatorReducer machine_reducer(data->jsgraph()); |
591 CommonOperatorReducer common_reducer(data->jsgraph()); | 600 CommonOperatorReducer common_reducer(data->jsgraph()); |
592 GraphReducer graph_reducer(data->graph(), temp_zone); | 601 JSGraphReducer graph_reducer(data->jsgraph(), temp_zone); |
593 AddReducer(data, &graph_reducer, &vn_reducer); | 602 AddReducer(data, &graph_reducer, &vn_reducer); |
594 AddReducer(data, &graph_reducer, &machine_reducer); | 603 AddReducer(data, &graph_reducer, &machine_reducer); |
595 AddReducer(data, &graph_reducer, &common_reducer); | 604 AddReducer(data, &graph_reducer, &common_reducer); |
596 graph_reducer.ReduceGraph(); | 605 graph_reducer.ReduceGraph(); |
597 } | 606 } |
598 }; | 607 }; |
599 | 608 |
600 | 609 |
601 struct ControlFlowOptimizationPhase { | 610 struct ControlFlowOptimizationPhase { |
602 static const char* phase_name() { return "control flow optimization"; } | 611 static const char* phase_name() { return "control flow optimization"; } |
603 | 612 |
604 void Run(PipelineData* data, Zone* temp_zone) { | 613 void Run(PipelineData* data, Zone* temp_zone) { |
605 ControlFlowOptimizer optimizer(data->graph(), data->common(), | 614 ControlFlowOptimizer optimizer(data->graph(), data->common(), |
606 data->machine(), temp_zone); | 615 data->machine(), temp_zone); |
607 optimizer.Optimize(); | 616 optimizer.Optimize(); |
608 } | 617 } |
609 }; | 618 }; |
610 | 619 |
611 | 620 |
612 struct ChangeLoweringPhase { | 621 struct ChangeLoweringPhase { |
613 static const char* phase_name() { return "change lowering"; } | 622 static const char* phase_name() { return "change lowering"; } |
614 | 623 |
615 void Run(PipelineData* data, Zone* temp_zone) { | 624 void Run(PipelineData* data, Zone* temp_zone) { |
616 ValueNumberingReducer vn_reducer(temp_zone); | 625 ValueNumberingReducer vn_reducer(temp_zone); |
617 ChangeLowering lowering(data->jsgraph()); | 626 ChangeLowering lowering(data->jsgraph()); |
618 MachineOperatorReducer machine_reducer(data->jsgraph()); | 627 MachineOperatorReducer machine_reducer(data->jsgraph()); |
619 CommonOperatorReducer common_reducer(data->jsgraph()); | 628 CommonOperatorReducer common_reducer(data->jsgraph()); |
620 GraphReducer graph_reducer(data->graph(), temp_zone); | 629 JSGraphReducer graph_reducer(data->jsgraph(), temp_zone); |
621 AddReducer(data, &graph_reducer, &vn_reducer); | 630 AddReducer(data, &graph_reducer, &vn_reducer); |
622 AddReducer(data, &graph_reducer, &lowering); | 631 AddReducer(data, &graph_reducer, &lowering); |
623 AddReducer(data, &graph_reducer, &machine_reducer); | 632 AddReducer(data, &graph_reducer, &machine_reducer); |
624 AddReducer(data, &graph_reducer, &common_reducer); | 633 AddReducer(data, &graph_reducer, &common_reducer); |
625 graph_reducer.ReduceGraph(); | 634 graph_reducer.ReduceGraph(); |
626 } | 635 } |
627 }; | 636 }; |
628 | 637 |
629 | 638 |
630 struct EarlyControlReductionPhase { | 639 struct EarlyControlReductionPhase { |
(...skipping 28 matching lines...) Expand all Loading... |
659 | 668 |
660 | 669 |
661 struct GenericLoweringPhase { | 670 struct GenericLoweringPhase { |
662 static const char* phase_name() { return "generic lowering"; } | 671 static const char* phase_name() { return "generic lowering"; } |
663 | 672 |
664 void Run(PipelineData* data, Zone* temp_zone) { | 673 void Run(PipelineData* data, Zone* temp_zone) { |
665 JSGenericLowering generic(data->info()->is_typing_enabled(), | 674 JSGenericLowering generic(data->info()->is_typing_enabled(), |
666 data->jsgraph()); | 675 data->jsgraph()); |
667 SelectLowering select(data->jsgraph()->graph(), data->jsgraph()->common()); | 676 SelectLowering select(data->jsgraph()->graph(), data->jsgraph()->common()); |
668 TailCallOptimization tco(data->common(), data->graph()); | 677 TailCallOptimization tco(data->common(), data->graph()); |
669 GraphReducer graph_reducer(data->graph(), temp_zone); | 678 JSGraphReducer graph_reducer(data->jsgraph(), temp_zone); |
670 AddReducer(data, &graph_reducer, &generic); | 679 AddReducer(data, &graph_reducer, &generic); |
671 AddReducer(data, &graph_reducer, &select); | 680 AddReducer(data, &graph_reducer, &select); |
672 // TODO(turbofan): TCO is currently limited to stubs. | 681 // TODO(turbofan): TCO is currently limited to stubs. |
673 if (data->info()->IsStub()) AddReducer(data, &graph_reducer, &tco); | 682 if (data->info()->IsStub()) AddReducer(data, &graph_reducer, &tco); |
674 graph_reducer.ReduceGraph(); | 683 graph_reducer.ReduceGraph(); |
675 } | 684 } |
676 }; | 685 }; |
677 | 686 |
678 | 687 |
679 struct ComputeSchedulePhase { | 688 struct ComputeSchedulePhase { |
(...skipping 640 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1320 tcf << AsC1VRegisterAllocationData("CodeGen", | 1329 tcf << AsC1VRegisterAllocationData("CodeGen", |
1321 data->register_allocation_data()); | 1330 data->register_allocation_data()); |
1322 } | 1331 } |
1323 | 1332 |
1324 data->DeleteRegisterAllocationZone(); | 1333 data->DeleteRegisterAllocationZone(); |
1325 } | 1334 } |
1326 | 1335 |
1327 } // namespace compiler | 1336 } // namespace compiler |
1328 } // namespace internal | 1337 } // namespace internal |
1329 } // namespace v8 | 1338 } // namespace v8 |
OLD | NEW |