| 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/move-optimizer.h" | 5 #include "src/compiler/move-optimizer.h" |
| 6 | 6 |
| 7 namespace v8 { | 7 namespace v8 { |
| 8 namespace internal { | 8 namespace internal { |
| 9 namespace compiler { | 9 namespace compiler { |
| 10 | 10 |
| 11 namespace { | 11 namespace { |
| 12 | 12 |
| 13 typedef std::pair<InstructionOperand, InstructionOperand> MoveKey; | 13 typedef std::pair<InstructionOperand, InstructionOperand> MoveKey; |
| 14 typedef ZoneMap<MoveKey, unsigned> MoveMap; | 14 typedef ZoneMap<MoveKey, unsigned> MoveMap; |
| 15 typedef ZoneSet<InstructionOperand> OperandSet; | 15 typedef ZoneSet<InstructionOperand> OperandSet; |
| 16 | 16 |
| 17 | 17 |
| 18 bool GapsCanMoveOver(Instruction* instr) { | 18 bool GapsCanMoveOver(Instruction* instr) { return instr->IsNop(); } |
| 19 return instr->IsSourcePosition() || instr->IsNop(); | |
| 20 } | |
| 21 | 19 |
| 22 | 20 |
| 23 int FindFirstNonEmptySlot(Instruction* instr) { | 21 int FindFirstNonEmptySlot(Instruction* instr) { |
| 24 int i = Instruction::FIRST_GAP_POSITION; | 22 int i = Instruction::FIRST_GAP_POSITION; |
| 25 for (; i <= Instruction::LAST_GAP_POSITION; i++) { | 23 for (; i <= Instruction::LAST_GAP_POSITION; i++) { |
| 26 auto move = instr->parallel_moves()[i]; | 24 auto move = instr->parallel_moves()[i]; |
| 27 if (move == nullptr) continue; | 25 if (move == nullptr) continue; |
| 28 auto move_ops = move->move_operands(); | 26 auto move_ops = move->move_operands(); |
| 29 auto op = move_ops->begin(); | 27 auto op = move_ops->begin(); |
| 30 for (; op != move_ops->end(); ++op) { | 28 for (; op != move_ops->end(); ++op) { |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 } | 136 } |
| 139 | 137 |
| 140 | 138 |
| 141 void MoveOptimizer::OptimizeMerge(InstructionBlock* block) { | 139 void MoveOptimizer::OptimizeMerge(InstructionBlock* block) { |
| 142 DCHECK(block->PredecessorCount() > 1); | 140 DCHECK(block->PredecessorCount() > 1); |
| 143 // Ensure that the last instruction in all incoming blocks don't contain | 141 // Ensure that the last instruction in all incoming blocks don't contain |
| 144 // things that would prevent moving gap moves across them. | 142 // things that would prevent moving gap moves across them. |
| 145 for (auto pred_index : block->predecessors()) { | 143 for (auto pred_index : block->predecessors()) { |
| 146 auto pred = code()->InstructionBlockAt(pred_index); | 144 auto pred = code()->InstructionBlockAt(pred_index); |
| 147 auto last_instr = code()->instructions()[pred->last_instruction_index()]; | 145 auto last_instr = code()->instructions()[pred->last_instruction_index()]; |
| 148 if (last_instr->IsSourcePosition()) continue; | |
| 149 if (last_instr->IsCall()) return; | 146 if (last_instr->IsCall()) return; |
| 150 if (last_instr->TempCount() != 0) return; | 147 if (last_instr->TempCount() != 0) return; |
| 151 if (last_instr->OutputCount() != 0) return; | 148 if (last_instr->OutputCount() != 0) return; |
| 152 for (size_t i = 0; i < last_instr->InputCount(); ++i) { | 149 for (size_t i = 0; i < last_instr->InputCount(); ++i) { |
| 153 auto op = last_instr->InputAt(i); | 150 auto op = last_instr->InputAt(i); |
| 154 if (!op->IsConstant() && !op->IsImmediate()) return; | 151 if (!op->IsConstant() && !op->IsImmediate()) return; |
| 155 } | 152 } |
| 156 } | 153 } |
| 157 // TODO(dcarney): pass a ZonePool down for this? | 154 // TODO(dcarney): pass a ZonePool down for this? |
| 158 MoveMap move_map(local_zone()); | 155 MoveMap move_map(local_zone()); |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 289 std::swap(*new_move, *it); | 286 std::swap(*new_move, *it); |
| 290 ++it; | 287 ++it; |
| 291 } | 288 } |
| 292 DCHECK_EQ(it, slot_1->move_operands()->end()); | 289 DCHECK_EQ(it, slot_1->move_operands()->end()); |
| 293 new_moves.clear(); | 290 new_moves.clear(); |
| 294 } | 291 } |
| 295 | 292 |
| 296 } // namespace compiler | 293 } // namespace compiler |
| 297 } // namespace internal | 294 } // namespace internal |
| 298 } // namespace v8 | 295 } // namespace v8 |
| OLD | NEW |