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 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 frame_ = nullptr; | 260 frame_ = nullptr; |
261 } | 261 } |
262 | 262 |
263 void DeleteRegisterAllocationZone() { | 263 void DeleteRegisterAllocationZone() { |
264 if (register_allocation_zone_ == nullptr) return; | 264 if (register_allocation_zone_ == nullptr) return; |
265 register_allocation_zone_scope_.Destroy(); | 265 register_allocation_zone_scope_.Destroy(); |
266 register_allocation_zone_ = nullptr; | 266 register_allocation_zone_ = nullptr; |
267 register_allocation_data_ = nullptr; | 267 register_allocation_data_ = nullptr; |
268 } | 268 } |
269 | 269 |
270 void InitializeInstructionSequence() { | 270 void InitializeInstructionSequence(const CallDescriptor* descriptor) { |
271 DCHECK(sequence_ == nullptr); | 271 DCHECK(sequence_ == nullptr); |
272 InstructionBlocks* instruction_blocks = | 272 InstructionBlocks* instruction_blocks = |
273 InstructionSequence::InstructionBlocksFor(instruction_zone(), | 273 InstructionSequence::InstructionBlocksFor(instruction_zone(), |
274 schedule()); | 274 schedule()); |
275 sequence_ = new (instruction_zone()) InstructionSequence( | 275 sequence_ = new (instruction_zone()) InstructionSequence( |
276 info()->isolate(), instruction_zone(), instruction_blocks); | 276 info()->isolate(), instruction_zone(), instruction_blocks); |
| 277 if (descriptor && descriptor->RequiresFrameAsIncoming()) { |
| 278 sequence_->instruction_blocks()[0]->mark_needs_frame(); |
| 279 } |
277 } | 280 } |
278 | 281 |
279 void InitializeFrameData(CallDescriptor* descriptor) { | 282 void InitializeFrameData(CallDescriptor* descriptor) { |
280 DCHECK(frame_ == nullptr); | 283 DCHECK(frame_ == nullptr); |
281 int fixed_frame_size = 0; | 284 int fixed_frame_size = 0; |
282 if (descriptor != nullptr) { | 285 if (descriptor != nullptr) { |
283 fixed_frame_size = CalculateFixedFrameSize(descriptor); | 286 fixed_frame_size = CalculateFixedFrameSize(descriptor); |
284 } | 287 } |
285 frame_ = new (instruction_zone()) Frame(fixed_frame_size, descriptor); | 288 frame_ = new (instruction_zone()) Frame(fixed_frame_size, descriptor); |
286 } | 289 } |
(...skipping 1042 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1329 | 1332 |
1330 if (data->schedule() == nullptr) Run<ComputeSchedulePhase>(); | 1333 if (data->schedule() == nullptr) Run<ComputeSchedulePhase>(); |
1331 TraceSchedule(data->info(), data->schedule()); | 1334 TraceSchedule(data->info(), data->schedule()); |
1332 | 1335 |
1333 BasicBlockProfiler::Data* profiler_data = nullptr; | 1336 BasicBlockProfiler::Data* profiler_data = nullptr; |
1334 if (FLAG_turbo_profiling) { | 1337 if (FLAG_turbo_profiling) { |
1335 profiler_data = BasicBlockInstrumentor::Instrument(info(), data->graph(), | 1338 profiler_data = BasicBlockInstrumentor::Instrument(info(), data->graph(), |
1336 data->schedule()); | 1339 data->schedule()); |
1337 } | 1340 } |
1338 | 1341 |
1339 data->InitializeInstructionSequence(); | 1342 data->InitializeInstructionSequence(call_descriptor); |
1340 | 1343 |
1341 data->InitializeFrameData(call_descriptor); | 1344 data->InitializeFrameData(call_descriptor); |
1342 // Select and schedule instructions covering the scheduled graph. | 1345 // Select and schedule instructions covering the scheduled graph. |
1343 Linkage linkage(call_descriptor); | 1346 Linkage linkage(call_descriptor); |
1344 Run<InstructionSelectionPhase>(&linkage); | 1347 Run<InstructionSelectionPhase>(&linkage); |
1345 | 1348 |
1346 if (FLAG_trace_turbo && !data->MayHaveUnverifiableGraph()) { | 1349 if (FLAG_trace_turbo && !data->MayHaveUnverifiableGraph()) { |
1347 TurboCfgFile tcf(isolate()); | 1350 TurboCfgFile tcf(isolate()); |
1348 tcf << AsC1V("CodeGen", data->schedule(), data->source_positions(), | 1351 tcf << AsC1V("CodeGen", data->schedule(), data->source_positions(), |
1349 data->sequence()); | 1352 data->sequence()); |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1478 Run<AllocateDoubleRegistersPhase<GreedyAllocator>>(); | 1481 Run<AllocateDoubleRegistersPhase<GreedyAllocator>>(); |
1479 } else { | 1482 } else { |
1480 Run<AllocateGeneralRegistersPhase<LinearScanAllocator>>(); | 1483 Run<AllocateGeneralRegistersPhase<LinearScanAllocator>>(); |
1481 Run<AllocateDoubleRegistersPhase<LinearScanAllocator>>(); | 1484 Run<AllocateDoubleRegistersPhase<LinearScanAllocator>>(); |
1482 } | 1485 } |
1483 | 1486 |
1484 if (FLAG_turbo_preprocess_ranges) { | 1487 if (FLAG_turbo_preprocess_ranges) { |
1485 Run<MergeSplintersPhase>(); | 1488 Run<MergeSplintersPhase>(); |
1486 } | 1489 } |
1487 | 1490 |
1488 // We plan to enable frame elision only for stubs and bytecode handlers. | |
1489 if (FLAG_turbo_frame_elision && info()->IsStub()) { | |
1490 Run<LocateSpillSlotsPhase>(); | |
1491 Run<FrameElisionPhase>(); | |
1492 } | |
1493 | |
1494 Run<AssignSpillSlotsPhase>(); | 1491 Run<AssignSpillSlotsPhase>(); |
1495 | 1492 |
1496 Run<CommitAssignmentPhase>(); | 1493 Run<CommitAssignmentPhase>(); |
1497 Run<PopulateReferenceMapsPhase>(); | 1494 Run<PopulateReferenceMapsPhase>(); |
1498 Run<ConnectRangesPhase>(); | 1495 Run<ConnectRangesPhase>(); |
1499 Run<ResolveControlFlowPhase>(); | 1496 Run<ResolveControlFlowPhase>(); |
1500 if (FLAG_turbo_move_optimization) { | 1497 if (FLAG_turbo_move_optimization) { |
1501 Run<OptimizeMovesPhase>(); | 1498 Run<OptimizeMovesPhase>(); |
1502 } | 1499 } |
1503 | 1500 |
| 1501 Run<LocateSpillSlotsPhase>(); |
| 1502 Run<FrameElisionPhase>(); |
| 1503 |
1504 if (FLAG_trace_turbo_graph) { | 1504 if (FLAG_trace_turbo_graph) { |
1505 OFStream os(stdout); | 1505 OFStream os(stdout); |
1506 PrintableInstructionSequence printable = {config, data->sequence()}; | 1506 PrintableInstructionSequence printable = {config, data->sequence()}; |
1507 os << "----- Instruction sequence after register allocation -----\n" | 1507 os << "----- Instruction sequence after register allocation -----\n" |
1508 << printable; | 1508 << printable; |
1509 } | 1509 } |
1510 | 1510 |
1511 if (verifier != nullptr) { | 1511 if (verifier != nullptr) { |
1512 verifier->VerifyAssignment(); | 1512 verifier->VerifyAssignment(); |
1513 verifier->VerifyGapMoves(); | 1513 verifier->VerifyGapMoves(); |
1514 } | 1514 } |
1515 | 1515 |
1516 if (FLAG_trace_turbo && !data->MayHaveUnverifiableGraph()) { | 1516 if (FLAG_trace_turbo && !data->MayHaveUnverifiableGraph()) { |
1517 TurboCfgFile tcf(data->isolate()); | 1517 TurboCfgFile tcf(data->isolate()); |
1518 tcf << AsC1VRegisterAllocationData("CodeGen", | 1518 tcf << AsC1VRegisterAllocationData("CodeGen", |
1519 data->register_allocation_data()); | 1519 data->register_allocation_data()); |
1520 } | 1520 } |
1521 | 1521 |
1522 data->DeleteRegisterAllocationZone(); | 1522 data->DeleteRegisterAllocationZone(); |
1523 } | 1523 } |
1524 | 1524 |
1525 Isolate* Pipeline::isolate() const { return info()->isolate(); } | 1525 Isolate* Pipeline::isolate() const { return info()->isolate(); } |
1526 | 1526 |
1527 } // namespace compiler | 1527 } // namespace compiler |
1528 } // namespace internal | 1528 } // namespace internal |
1529 } // namespace v8 | 1529 } // namespace v8 |
OLD | NEW |