diff options
Diffstat (limited to 'deps/v8/src/compiler/scheduler.h')
-rw-r--r-- | deps/v8/src/compiler/scheduler.h | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/deps/v8/src/compiler/scheduler.h b/deps/v8/src/compiler/scheduler.h new file mode 100644 index 000000000..db620edb5 --- /dev/null +++ b/deps/v8/src/compiler/scheduler.h @@ -0,0 +1,84 @@ +// Copyright 2013 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef V8_COMPILER_SCHEDULER_H_ +#define V8_COMPILER_SCHEDULER_H_ + +#include <vector> + +#include "src/v8.h" + +#include "src/compiler/opcodes.h" +#include "src/compiler/schedule.h" +#include "src/zone-allocator.h" +#include "src/zone-containers.h" + +namespace v8 { +namespace internal { +namespace compiler { + +// Computes a schedule from a graph, placing nodes into basic blocks and +// ordering the basic blocks in the special RPO order. +class Scheduler { + public: + // Create a new schedule and place all computations from the graph in it. + static Schedule* ComputeSchedule(Graph* graph); + + // Compute the RPO of blocks in an existing schedule. + static BasicBlockVector* ComputeSpecialRPO(Schedule* schedule); + + private: + Graph* graph_; + Schedule* schedule_; + NodeVector branches_; + NodeVector calls_; + NodeVector deopts_; + NodeVector returns_; + NodeVector loops_and_merges_; + BasicBlockVector node_block_placement_; + IntVector unscheduled_uses_; + NodeVectorVector scheduled_nodes_; + NodeVector schedule_root_nodes_; + IntVector schedule_early_rpo_index_; + + Scheduler(Zone* zone, Graph* graph, Schedule* schedule); + + int GetRPONumber(BasicBlock* block) { + DCHECK(block->rpo_number_ >= 0 && + block->rpo_number_ < static_cast<int>(schedule_->rpo_order_.size())); + DCHECK(schedule_->rpo_order_[block->rpo_number_] == block); + return block->rpo_number_; + } + + void PrepareAuxiliaryNodeData(); + void PrepareAuxiliaryBlockData(); + + friend class CreateBlockVisitor; + void CreateBlocks(); + + void WireBlocks(); + + void AddPredecessorsForLoopsAndMerges(); + void AddSuccessorsForBranches(); + void AddSuccessorsForReturns(); + void AddSuccessorsForCalls(); + void AddSuccessorsForDeopts(); + + void GenerateImmediateDominatorTree(); + BasicBlock* GetCommonDominator(BasicBlock* b1, BasicBlock* b2); + + friend class ScheduleEarlyNodeVisitor; + void ScheduleEarly(); + + friend class PrepareUsesVisitor; + void PrepareUses(); + + friend class ScheduleLateNodeVisitor; + void ScheduleLate(); +}; +} +} +} // namespace v8::internal::compiler + +#endif // V8_COMPILER_SCHEDULER_H_ |