| // Copyright 2014 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_BACKEND_MOVE_OPTIMIZER_H_ | 
 | #define V8_COMPILER_BACKEND_MOVE_OPTIMIZER_H_ | 
 |  | 
 | #include "src/common/globals.h" | 
 | #include "src/compiler/backend/instruction.h" | 
 | #include "src/zone/zone-containers.h" | 
 |  | 
 | namespace v8 { | 
 | namespace internal { | 
 | namespace compiler { | 
 |  | 
 | class V8_EXPORT_PRIVATE MoveOptimizer final { | 
 |  public: | 
 |   MoveOptimizer(Zone* local_zone, InstructionSequence* code); | 
 |   MoveOptimizer(const MoveOptimizer&) = delete; | 
 |   MoveOptimizer& operator=(const MoveOptimizer&) = delete; | 
 |  | 
 |   void Run(); | 
 |  | 
 |  private: | 
 |   using MoveOpVector = ZoneVector<MoveOperands*>; | 
 |   using Instructions = ZoneVector<Instruction*>; | 
 |  | 
 |   InstructionSequence* code() const { return code_; } | 
 |   Zone* local_zone() const { return local_zone_; } | 
 |   Zone* code_zone() const { return code()->zone(); } | 
 |   MoveOpVector& local_vector() { return local_vector_; } | 
 |  | 
 |   // Consolidate moves into the first gap. | 
 |   void CompressGaps(Instruction* instr); | 
 |  | 
 |   // Attempt to push down to the last instruction those moves that can. | 
 |   void CompressBlock(InstructionBlock* block); | 
 |  | 
 |   // Consolidate moves into the first gap. | 
 |   void CompressMoves(ParallelMove* left, MoveOpVector* right); | 
 |  | 
 |   // Push down those moves in the gap of from that do not change the | 
 |   // semantics of the from instruction, nor the semantics of the moves | 
 |   // that remain behind. | 
 |   void MigrateMoves(Instruction* to, Instruction* from); | 
 |  | 
 |   void RemoveClobberedDestinations(Instruction* instruction); | 
 |  | 
 |   const Instruction* LastInstruction(const InstructionBlock* block) const; | 
 |  | 
 |   // Consolidate common moves appearing across all predecessors of a block. | 
 |   void OptimizeMerge(InstructionBlock* block); | 
 |   void FinalizeMoves(Instruction* instr); | 
 |  | 
 |   Zone* const local_zone_; | 
 |   InstructionSequence* const code_; | 
 |   MoveOpVector local_vector_; | 
 |  | 
 |   // Reusable buffers for storing operand sets. We need at most two sets | 
 |   // at any given time, so we create two buffers. | 
 |   ZoneVector<InstructionOperand> operand_buffer1; | 
 |   ZoneVector<InstructionOperand> operand_buffer2; | 
 | }; | 
 |  | 
 | }  // namespace compiler | 
 | }  // namespace internal | 
 | }  // namespace v8 | 
 |  | 
 | #endif  // V8_COMPILER_BACKEND_MOVE_OPTIMIZER_H_ |