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

Side by Side Diff: src/compiler/register-allocator.h

Issue 688633002: [turbofan] add configuration parameters for register allocator (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: rebase Created 6 years, 1 month 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
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 #ifndef V8_REGISTER_ALLOCATOR_H_ 5 #ifndef V8_REGISTER_ALLOCATOR_H_
6 #define V8_REGISTER_ALLOCATOR_H_ 6 #define V8_REGISTER_ALLOCATOR_H_
7 7
8 #include "src/allocation.h"
9 #include "src/compiler/instruction.h" 8 #include "src/compiler/instruction.h"
10 #include "src/macro-assembler.h" 9 #include "src/zone-containers.h"
11 #include "src/zone.h"
12 10
13 namespace v8 { 11 namespace v8 {
14 namespace internal { 12 namespace internal {
15 namespace compiler { 13 namespace compiler {
16 14
17 class PipelineStatistics; 15 class PipelineStatistics;
18 16
19 enum RegisterKind { 17 enum RegisterKind {
20 UNALLOCATED_REGISTERS, 18 UNALLOCATED_REGISTERS,
21 GENERAL_REGISTERS, 19 GENERAL_REGISTERS,
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
314 int spill_start_index_; 312 int spill_start_index_;
315 313
316 friend class RegisterAllocator; // Assigns to kind_. 314 friend class RegisterAllocator; // Assigns to kind_.
317 315
318 DISALLOW_COPY_AND_ASSIGN(LiveRange); 316 DISALLOW_COPY_AND_ASSIGN(LiveRange);
319 }; 317 };
320 318
321 319
322 class RegisterAllocator BASE_EMBEDDED { 320 class RegisterAllocator BASE_EMBEDDED {
323 public: 321 public:
324 explicit RegisterAllocator(Zone* local_zone, Frame* frame, 322 class Config {
325 InstructionSequence* code, 323 public:
324 int num_general_registers_;
325 int num_double_registers_;
326 int num_aliased_double_registers_;
327 const char* (*GeneralRegisterName)(int allocation_index);
328 const char* (*DoubleRegisterName)(int allocation_index);
Jarin 2014/10/29 17:37:43 Why can't these guys be virtual methods?
329 };
330
331 static Config PlatformConfig();
332
333 explicit RegisterAllocator(const Config& config, Zone* local_zone,
334 Frame* frame, InstructionSequence* code,
326 const char* debug_name = nullptr); 335 const char* debug_name = nullptr);
327 336
328 bool Allocate(PipelineStatistics* stats = NULL); 337 bool Allocate(PipelineStatistics* stats = NULL);
329 bool AllocationOk() { return allocation_ok_; } 338 bool AllocationOk() { return allocation_ok_; }
330 BitVector* assigned_registers() { return assigned_registers_; } 339 BitVector* assigned_registers() { return assigned_registers_; }
331 BitVector* assigned_double_registers() { return assigned_double_registers_; } 340 BitVector* assigned_double_registers() { return assigned_double_registers_; }
332 341
333 const ZoneList<LiveRange*>* live_ranges() const { return &live_ranges_; } 342 const ZoneList<LiveRange*>& live_ranges() const { return live_ranges_; }
334 const Vector<LiveRange*>* fixed_live_ranges() const { 343 const ZoneVector<LiveRange*>& fixed_live_ranges() const {
335 return &fixed_live_ranges_; 344 return fixed_live_ranges_;
336 } 345 }
337 const Vector<LiveRange*>* fixed_double_live_ranges() const { 346 const ZoneVector<LiveRange*>& fixed_double_live_ranges() const {
338 return &fixed_double_live_ranges_; 347 return fixed_double_live_ranges_;
339 } 348 }
340 InstructionSequence* code() const { return code_; } 349 InstructionSequence* code() const { return code_; }
341 350
342 private: 351 private:
343 int GetVirtualRegister() { 352 int GetVirtualRegister() {
344 int vreg = code()->NextVirtualRegister(); 353 int vreg = code()->NextVirtualRegister();
345 if (vreg >= UnallocatedOperand::kMaxVirtualRegisters) { 354 if (vreg >= UnallocatedOperand::kMaxVirtualRegisters) {
346 allocation_ok_ = false; 355 allocation_ok_ = false;
347 // Maintain the invariant that we return something below the maximum. 356 // Maintain the invariant that we return something below the maximum.
348 return 0; 357 return 0;
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 // Return parallel move that should be used to connect ranges split at the 483 // Return parallel move that should be used to connect ranges split at the
475 // given position. 484 // given position.
476 ParallelMove* GetConnectingParallelMove(LifetimePosition pos); 485 ParallelMove* GetConnectingParallelMove(LifetimePosition pos);
477 486
478 // Return the block which contains give lifetime position. 487 // Return the block which contains give lifetime position.
479 const InstructionBlock* GetInstructionBlock(LifetimePosition pos); 488 const InstructionBlock* GetInstructionBlock(LifetimePosition pos);
480 489
481 // Helper methods for the fixed registers. 490 // Helper methods for the fixed registers.
482 int RegisterCount() const; 491 int RegisterCount() const;
483 static int FixedLiveRangeID(int index) { return -index - 1; } 492 static int FixedLiveRangeID(int index) { return -index - 1; }
484 static int FixedDoubleLiveRangeID(int index); 493 int FixedDoubleLiveRangeID(int index);
485 LiveRange* FixedLiveRangeFor(int index); 494 LiveRange* FixedLiveRangeFor(int index);
486 LiveRange* FixedDoubleLiveRangeFor(int index); 495 LiveRange* FixedDoubleLiveRangeFor(int index);
487 LiveRange* LiveRangeFor(int index); 496 LiveRange* LiveRangeFor(int index);
488 GapInstruction* GetLastGap(const InstructionBlock* block); 497 GapInstruction* GetLastGap(const InstructionBlock* block);
489 498
490 const char* RegisterName(int allocation_index); 499 const char* RegisterName(int allocation_index);
491 500
492 Instruction* InstructionAt(int index) { return code()->InstructionAt(index); } 501 Instruction* InstructionAt(int index) { return code()->InstructionAt(index); }
493 502
494 Frame* frame() const { return frame_; } 503 Frame* frame() const { return frame_; }
495 const char* debug_name() const { return debug_name_; } 504 const char* debug_name() const { return debug_name_; }
505 const Config& config() const { return config_; }
496 506
497 Zone* const zone_; 507 Zone* const zone_;
498 Frame* const frame_; 508 Frame* const frame_;
499 InstructionSequence* const code_; 509 InstructionSequence* const code_;
500 const char* const debug_name_; 510 const char* const debug_name_;
501 511
512 const Config config_;
513
502 // During liveness analysis keep a mapping from block id to live_in sets 514 // During liveness analysis keep a mapping from block id to live_in sets
503 // for blocks already analyzed. 515 // for blocks already analyzed.
504 ZoneList<BitVector*> live_in_sets_; 516 ZoneList<BitVector*> live_in_sets_;
505 517
506 // Liveness analysis results. 518 // Liveness analysis results.
507 ZoneList<LiveRange*> live_ranges_; 519 ZoneList<LiveRange*> live_ranges_;
508 520
509 // Lists of live ranges 521 // Lists of live ranges
510 EmbeddedVector<LiveRange*, Register::kMaxNumAllocatableRegisters> 522 ZoneVector<LiveRange*> fixed_live_ranges_;
511 fixed_live_ranges_; 523 ZoneVector<LiveRange*> fixed_double_live_ranges_;
512 EmbeddedVector<LiveRange*, DoubleRegister::kMaxNumAllocatableRegisters>
513 fixed_double_live_ranges_;
514 ZoneList<LiveRange*> unhandled_live_ranges_; 524 ZoneList<LiveRange*> unhandled_live_ranges_;
515 ZoneList<LiveRange*> active_live_ranges_; 525 ZoneList<LiveRange*> active_live_ranges_;
516 ZoneList<LiveRange*> inactive_live_ranges_; 526 ZoneList<LiveRange*> inactive_live_ranges_;
517 ZoneList<LiveRange*> reusable_slots_; 527 ZoneList<LiveRange*> reusable_slots_;
518 528
519 RegisterKind mode_; 529 RegisterKind mode_;
520 int num_registers_; 530 int num_registers_;
521 531
522 BitVector* assigned_registers_; 532 BitVector* assigned_registers_;
523 BitVector* assigned_double_registers_; 533 BitVector* assigned_double_registers_;
524 534
525 // Indicates success or failure during register allocation. 535 // Indicates success or failure during register allocation.
526 bool allocation_ok_; 536 bool allocation_ok_;
527 537
528 #ifdef DEBUG 538 #ifdef DEBUG
529 LifetimePosition allocation_finger_; 539 LifetimePosition allocation_finger_;
530 #endif 540 #endif
531 541
532 DISALLOW_COPY_AND_ASSIGN(RegisterAllocator); 542 DISALLOW_COPY_AND_ASSIGN(RegisterAllocator);
533 }; 543 };
534 544
535 } 545 }
536 } 546 }
537 } // namespace v8::internal::compiler 547 } // namespace v8::internal::compiler
538 548
539 #endif // V8_REGISTER_ALLOCATOR_H_ 549 #endif // V8_REGISTER_ALLOCATOR_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698