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 #include "src/compiler/pipeline.h" |
6 #include "test/unittests/compiler/instruction-sequence-unittest.h" | 7 #include "test/unittests/compiler/instruction-sequence-unittest.h" |
7 | 8 |
8 namespace v8 { | 9 namespace v8 { |
9 namespace internal { | 10 namespace internal { |
10 namespace compiler { | 11 namespace compiler { |
11 | 12 |
12 class MoveOptimizerTest : public InstructionSequenceTest { | 13 class MoveOptimizerTest : public InstructionSequenceTest { |
13 public: | 14 public: |
14 Instruction* LastInstruction() { return sequence()->instructions().back(); } | 15 Instruction* LastInstruction() { return sequence()->instructions().back(); } |
15 | 16 |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 AddMove(last, Reg(0), Reg(1)); | 221 AddMove(last, Reg(0), Reg(1)); |
221 EndBlock(Last()); | 222 EndBlock(Last()); |
222 Optimize(); | 223 Optimize(); |
223 | 224 |
224 ParallelMove* inst1_start = | 225 ParallelMove* inst1_start = |
225 ctant_def->GetParallelMove(Instruction::GapPosition::START); | 226 ctant_def->GetParallelMove(Instruction::GapPosition::START); |
226 ParallelMove* inst1_end = | 227 ParallelMove* inst1_end = |
227 ctant_def->GetParallelMove(Instruction::GapPosition::END); | 228 ctant_def->GetParallelMove(Instruction::GapPosition::END); |
228 ParallelMove* last_start = | 229 ParallelMove* last_start = |
229 last->GetParallelMove(Instruction::GapPosition::START); | 230 last->GetParallelMove(Instruction::GapPosition::START); |
230 CHECK(inst1_start == nullptr || inst1_start->size() == 0); | 231 CHECK(inst1_start == nullptr || NonRedundantSize(inst1_start) == 0); |
231 CHECK(inst1_end == nullptr || inst1_end->size() == 0); | 232 CHECK(inst1_end == nullptr || NonRedundantSize(inst1_end) == 0); |
232 CHECK(last_start->size() == 2); | 233 CHECK(last_start->size() == 2); |
233 int redundants = 0; | 234 int redundants = 0; |
234 int assignment = 0; | 235 int assignment = 0; |
235 for (MoveOperands* move : *last_start) { | 236 for (MoveOperands* move : *last_start) { |
236 if (move->IsRedundant()) { | 237 if (move->IsRedundant()) { |
237 ++redundants; | 238 ++redundants; |
238 } else { | 239 } else { |
239 ++assignment; | 240 ++assignment; |
240 CHECK(move->destination().IsRegister()); | 241 CHECK(move->destination().IsRegister()); |
241 CHECK(move->source().IsConstant()); | 242 CHECK(move->source().IsConstant()); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
314 ParallelMove* b1_move = last_move_b1->parallel_moves()[0]; | 315 ParallelMove* b1_move = last_move_b1->parallel_moves()[0]; |
315 CHECK_EQ(2, NonRedundantSize(b1_move)); | 316 CHECK_EQ(2, NonRedundantSize(b1_move)); |
316 CHECK(Contains(b1_move, Reg(0), Reg(1))); | 317 CHECK(Contains(b1_move, Reg(0), Reg(1))); |
317 CHECK(Contains(b1_move, Reg(2), Reg(0))); | 318 CHECK(Contains(b1_move, Reg(2), Reg(0))); |
318 | 319 |
319 ParallelMove* b2_move = last_move_b2->parallel_moves()[0]; | 320 ParallelMove* b2_move = last_move_b2->parallel_moves()[0]; |
320 CHECK_EQ(1, NonRedundantSize(b2_move)); | 321 CHECK_EQ(1, NonRedundantSize(b2_move)); |
321 CHECK(Contains(b1_move, Reg(0), Reg(1))); | 322 CHECK(Contains(b1_move, Reg(0), Reg(1))); |
322 } | 323 } |
323 | 324 |
| 325 TEST_F(MoveOptimizerTest, ClobberedDestinationsAreEliminated) { |
| 326 StartBlock(); |
| 327 EmitNop(); |
| 328 Instruction* first_instr = LastInstruction(); |
| 329 AddMove(first_instr, Reg(0), Reg(1)); |
| 330 EmitOI(Reg(1), 0, nullptr); |
| 331 Instruction* last_instr = LastInstruction(); |
| 332 EndBlock(); |
| 333 Optimize(); |
| 334 |
| 335 ParallelMove* first_move = first_instr->parallel_moves()[0]; |
| 336 CHECK_EQ(0, NonRedundantSize(first_move)); |
| 337 |
| 338 ParallelMove* last_move = last_instr->parallel_moves()[0]; |
| 339 CHECK_EQ(0, NonRedundantSize(last_move)); |
| 340 } |
324 | 341 |
325 } // namespace compiler | 342 } // namespace compiler |
326 } // namespace internal | 343 } // namespace internal |
327 } // namespace v8 | 344 } // namespace v8 |
OLD | NEW |