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

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

Issue 1472803004: [turbofan] Simplified splintering code. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years 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 | « src/compiler/live-range-separator.cc ('k') | src/compiler/register-allocator.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 826 matching lines...) Expand 10 before | Expand all | Expand 10 after
837 static const char* phase_name() { return "allocate double registers"; } 837 static const char* phase_name() { return "allocate double registers"; }
838 838
839 void Run(PipelineData* data, Zone* temp_zone) { 839 void Run(PipelineData* data, Zone* temp_zone) {
840 RegAllocator allocator(data->register_allocation_data(), DOUBLE_REGISTERS, 840 RegAllocator allocator(data->register_allocation_data(), DOUBLE_REGISTERS,
841 temp_zone); 841 temp_zone);
842 allocator.AllocateRegisters(); 842 allocator.AllocateRegisters();
843 } 843 }
844 }; 844 };
845 845
846 846
847 struct MarkSpilledOnlyInDeferredPhase {
Jarin 2015/11/25 10:33:08 I think there is no need to introduce a new phase
Mircea Trofin 2015/11/25 16:21:36 It can be done, but it seemed cleaner to have it s
848 static const char* phase_name() {
849 return "mark ranges spilled in deferred blocks";
850 }
851
852 void Run(PipelineData* pipeline_data, Zone* temp_zone) {
853 RegisterAllocationData* data = pipeline_data->register_allocation_data();
854 for (TopLevelLiveRange* top : data->live_ranges()) {
Jarin 2015/11/25 10:33:08 The pipeline should not know about implementation
Mircea Trofin 2015/11/25 16:21:36 done as a side-effect of addressing the above.
855 if (top == nullptr || top->IsEmpty() || top->splinter() == nullptr) {
856 continue;
857 }
858
859 LiveRange* child = top;
860 for (; child != nullptr; child = child->next()) {
861 if (child->spilled() ||
862 child->NextSlotPosition(child->Start()) != nullptr) {
863 break;
864 }
865 }
866 if (child == nullptr) top->MarkSpilledInDeferredBlock();
867 }
868 }
869 };
870
871
847 struct MergeSplintersPhase { 872 struct MergeSplintersPhase {
848 static const char* phase_name() { return "merge splintered ranges"; } 873 static const char* phase_name() { return "merge splintered ranges"; }
849 void Run(PipelineData* pipeline_data, Zone* temp_zone) { 874 void Run(PipelineData* pipeline_data, Zone* temp_zone) {
850 RegisterAllocationData* data = pipeline_data->register_allocation_data(); 875 RegisterAllocationData* data = pipeline_data->register_allocation_data();
851 LiveRangeMerger live_range_merger(data, temp_zone); 876 LiveRangeMerger live_range_merger(data, temp_zone);
852 live_range_merger.Merge(); 877 live_range_merger.Merge();
853 } 878 }
854 }; 879 };
855 880
856 881
(...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after
1369 Run<ResolvePhisPhase>(); 1394 Run<ResolvePhisPhase>();
1370 Run<BuildLiveRangesPhase>(); 1395 Run<BuildLiveRangesPhase>();
1371 if (FLAG_trace_turbo_graph) { 1396 if (FLAG_trace_turbo_graph) {
1372 OFStream os(stdout); 1397 OFStream os(stdout);
1373 PrintableInstructionSequence printable = {config, data->sequence()}; 1398 PrintableInstructionSequence printable = {config, data->sequence()};
1374 os << "----- Instruction sequence before register allocation -----\n" 1399 os << "----- Instruction sequence before register allocation -----\n"
1375 << printable; 1400 << printable;
1376 } 1401 }
1377 if (verifier != nullptr) { 1402 if (verifier != nullptr) {
1378 CHECK(!data->register_allocation_data()->ExistsUseWithoutDefinition()); 1403 CHECK(!data->register_allocation_data()->ExistsUseWithoutDefinition());
1404 CHECK(data->register_allocation_data()
1405 ->RangesDefinedInDeferredStaysInDeferred());
1379 } 1406 }
1380 1407
1381 if (FLAG_turbo_preprocess_ranges) { 1408 if (FLAG_turbo_preprocess_ranges) {
1382 Run<SplinterLiveRangesPhase>(); 1409 Run<SplinterLiveRangesPhase>();
1383 } 1410 }
1384 1411
1385 if (FLAG_turbo_greedy_regalloc) { 1412 if (FLAG_turbo_greedy_regalloc) {
1386 Run<AllocateGeneralRegistersPhase<GreedyAllocator>>(); 1413 Run<AllocateGeneralRegistersPhase<GreedyAllocator>>();
1387 Run<AllocateDoubleRegistersPhase<GreedyAllocator>>(); 1414 Run<AllocateDoubleRegistersPhase<GreedyAllocator>>();
1388 } else { 1415 } else {
1389 Run<AllocateGeneralRegistersPhase<LinearScanAllocator>>(); 1416 Run<AllocateGeneralRegistersPhase<LinearScanAllocator>>();
1390 Run<AllocateDoubleRegistersPhase<LinearScanAllocator>>(); 1417 Run<AllocateDoubleRegistersPhase<LinearScanAllocator>>();
1391 } 1418 }
1392 1419
1393 if (FLAG_turbo_preprocess_ranges) { 1420 if (FLAG_turbo_preprocess_ranges) {
1421 Run<MarkSpilledOnlyInDeferredPhase>();
1394 Run<MergeSplintersPhase>(); 1422 Run<MergeSplintersPhase>();
1395 } 1423 }
1396 1424
1397 if (FLAG_turbo_frame_elision) { 1425 if (FLAG_turbo_frame_elision) {
1398 Run<LocateSpillSlotsPhase>(); 1426 Run<LocateSpillSlotsPhase>();
1399 Run<FrameElisionPhase>(); 1427 Run<FrameElisionPhase>();
1400 } 1428 }
1401 1429
1402 Run<AssignSpillSlotsPhase>(); 1430 Run<AssignSpillSlotsPhase>();
1403 1431
(...skipping 22 matching lines...) Expand all
1426 tcf << AsC1VRegisterAllocationData("CodeGen", 1454 tcf << AsC1VRegisterAllocationData("CodeGen",
1427 data->register_allocation_data()); 1455 data->register_allocation_data());
1428 } 1456 }
1429 1457
1430 data->DeleteRegisterAllocationZone(); 1458 data->DeleteRegisterAllocationZone();
1431 } 1459 }
1432 1460
1433 } // namespace compiler 1461 } // namespace compiler
1434 } // namespace internal 1462 } // namespace internal
1435 } // namespace v8 1463 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/live-range-separator.cc ('k') | src/compiler/register-allocator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698