blob: 8e932a0d730e78378a23456bdb184bdf10b61840 [file] [log] [blame]
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001// 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
3// found in the LICENSE file.
4
5#ifndef V8_COMPILER_MOVE_OPTIMIZER_
6#define V8_COMPILER_MOVE_OPTIMIZER_
7
8#include "src/compiler/instruction.h"
9#include "src/zone-containers.h"
10
11namespace v8 {
12namespace internal {
13namespace compiler {
14
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000015class MoveOptimizer final {
Emily Bernierd0a1eb72015-03-24 16:35:39 -040016 public:
17 MoveOptimizer(Zone* local_zone, InstructionSequence* code);
18 void Run();
19
20 private:
21 typedef ZoneVector<MoveOperands*> MoveOpVector;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000022 typedef ZoneVector<Instruction*> Instructions;
Emily Bernierd0a1eb72015-03-24 16:35:39 -040023
24 InstructionSequence* code() const { return code_; }
25 Zone* local_zone() const { return local_zone_; }
26 Zone* code_zone() const { return code()->zone(); }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000027 MoveOpVector& local_vector() { return local_vector_; }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040028
Ben Murdoch097c5b22016-05-18 11:27:45 +010029 // Consolidate moves into the first gap.
30 void CompressGaps(Instruction* instr);
31
32 // Attempt to push down to the last instruction those moves that can.
33 void CompressBlock(InstructionBlock* block);
34
35 // Consolidate moves into the first gap.
36 void CompressMoves(ParallelMove* left, MoveOpVector* right);
37
38 // Push down those moves in the gap of from that do not change the
39 // semantics of the from instruction, nor the semantics of the moves
40 // that remain behind.
41 void MigrateMoves(Instruction* to, Instruction* from);
42
43 void RemoveClobberedDestinations(Instruction* instruction);
44
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000045 const Instruction* LastInstruction(const InstructionBlock* block) const;
Ben Murdoch097c5b22016-05-18 11:27:45 +010046
47 // Consolidate common moves appearing accross all predecessors of a block.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000048 void OptimizeMerge(InstructionBlock* block);
49 void FinalizeMoves(Instruction* instr);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040050
51 Zone* const local_zone_;
52 InstructionSequence* const code_;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000053 MoveOpVector local_vector_;
Emily Bernierd0a1eb72015-03-24 16:35:39 -040054
55 DISALLOW_COPY_AND_ASSIGN(MoveOptimizer);
56};
57
58} // namespace compiler
59} // namespace internal
60} // namespace v8
61
62#endif // V8_COMPILER_MOVE_OPTIMIZER_