Index: src/arm/assembler-arm.cc |
diff --git a/src/arm/assembler-arm.cc b/src/arm/assembler-arm.cc |
index 6dd381febb26bacfc14bc3095594682b35e507f7..846464ab5a1f7786961b3d329cc5b5f46b58240e 100644 |
--- a/src/arm/assembler-arm.cc |
+++ b/src/arm/assembler-arm.cc |
@@ -1213,31 +1213,32 @@ void Assembler::ldr(Register dst, const MemOperand& src, Condition cond) { |
// Both instructions can be eliminated if ry = rx. |
// If ry != rx, a register copy from ry to rx is inserted |
// after eliminating the push and the pop instructions. |
- Instr push_instr = instr_at(pc_ - 2 * kInstrSize); |
- Instr pop_instr = instr_at(pc_ - 1 * kInstrSize); |
- |
- if (can_peephole_optimize(2) && |
- IsPush(push_instr) && |
- IsPop(pop_instr)) { |
- if ((pop_instr & kRdMask) != (push_instr & kRdMask)) { |
- // For consecutive push and pop on different registers, |
- // we delete both the push & pop and insert a register move. |
- // push ry, pop rx --> mov rx, ry |
- Register reg_pushed, reg_popped; |
- reg_pushed = GetRd(push_instr); |
- reg_popped = GetRd(pop_instr); |
- pc_ -= 2 * kInstrSize; |
- // Insert a mov instruction, which is better than a pair of push & pop |
- mov(reg_popped, reg_pushed); |
- if (FLAG_print_peephole_optimization) { |
- PrintF("%x push/pop (diff reg) replaced by a reg move\n", pc_offset()); |
- } |
- } else { |
- // For consecutive push and pop on the same register, |
- // both the push and the pop can be deleted. |
- pc_ -= 2 * kInstrSize; |
- if (FLAG_print_peephole_optimization) { |
- PrintF("%x push/pop (same reg) eliminated\n", pc_offset()); |
+ if (can_peephole_optimize(2)) { |
+ Instr push_instr = instr_at(pc_ - 2 * kInstrSize); |
+ Instr pop_instr = instr_at(pc_ - 1 * kInstrSize); |
+ |
+ if (IsPush(push_instr) && IsPop(pop_instr)) { |
+ if ((pop_instr & kRdMask) != (push_instr & kRdMask)) { |
+ // For consecutive push and pop on different registers, |
+ // we delete both the push & pop and insert a register move. |
+ // push ry, pop rx --> mov rx, ry |
+ Register reg_pushed, reg_popped; |
+ reg_pushed = GetRd(push_instr); |
+ reg_popped = GetRd(pop_instr); |
+ pc_ -= 2 * kInstrSize; |
+ // Insert a mov instruction, which is better than a pair of push & pop |
+ mov(reg_popped, reg_pushed); |
+ if (FLAG_print_peephole_optimization) { |
+ PrintF("%x push/pop (diff reg) replaced by a reg move\n", |
+ pc_offset()); |
+ } |
+ } else { |
+ // For consecutive push and pop on the same register, |
+ // both the push and the pop can be deleted. |
+ pc_ -= 2 * kInstrSize; |
+ if (FLAG_print_peephole_optimization) { |
+ PrintF("%x push/pop (same reg) eliminated\n", pc_offset()); |
+ } |
} |
} |
} |