Chromium Code Reviews| Index: src/arm/lithium-arm.cc | 
| diff --git a/src/arm/lithium-arm.cc b/src/arm/lithium-arm.cc | 
| index 0ea235c417fd9a955145eb59cba2ab3fb8a8d2dd..107f10bdb1b57a700ea8aaf174da52549439e1bd 100644 | 
| --- a/src/arm/lithium-arm.cc | 
| +++ b/src/arm/lithium-arm.cc | 
| @@ -860,7 +860,22 @@ void LChunkBuilder::VisitInstruction(HInstruction* current) { | 
| HInstruction* old_current = current_instruction_; | 
| current_instruction_ = current; | 
| if (current->has_position()) position_ = current->position(); | 
| - LInstruction* instr = current->CompileToLithium(this); | 
| + | 
| + LInstruction* instr = NULL; | 
| + if (current->CanReplaceWithDummyUses()) { | 
| + HValue* first_operand = current->OperandCount() == 0 | 
| + ? graph()->GetConstant1() : | 
| + current->OperandAt(0); | 
| + instr = DefineAsRegister(new(zone()) LDummyUse(UseAny(first_operand))); | 
| + for (int i = 1; i < current->OperandCount(); ++i) { | 
| + LInstruction* dummy = | 
| + new(zone()) LDummyUse(UseAny(current->OperandAt(1))); | 
| 
 
Jakob Kummerow
2013/10/01 11:59:20
OperandAt(i)
 
danno
2013/10/23 11:46:51
Done.
 
 | 
| + dummy->set_hydrogen_value(current); | 
| + chunk_->AddInstruction(dummy, current_block_); | 
| + } | 
| + } else { | 
| + instr = current->CompileToLithium(this); | 
| + } | 
| if (instr != NULL) { | 
| #if DEBUG | 
| @@ -991,19 +1006,15 @@ LEnvironment* LChunkBuilder::CreateEnvironment( | 
| LInstruction* LChunkBuilder::DoGoto(HGoto* instr) { | 
| - return new(zone()) LGoto(instr->FirstSuccessor()->block_id()); | 
| + return new(zone()) LGoto(instr->FirstSuccessor()); | 
| } | 
| LInstruction* LChunkBuilder::DoBranch(HBranch* instr) { | 
| - HValue* value = instr->value(); | 
| - if (value->EmitAtUses()) { | 
| - HBasicBlock* successor = HConstant::cast(value)->BooleanValue() | 
| - ? instr->FirstSuccessor() | 
| - : instr->SecondSuccessor(); | 
| - return new(zone()) LGoto(successor->block_id()); | 
| - } | 
| + LInstruction* goto_instr = CheckElideControlInstruction(instr); | 
| + if (goto_instr != NULL) return goto_instr; | 
| + HValue* value = instr->value(); | 
| LBranch* result = new(zone()) LBranch(UseRegister(value)); | 
| // Tagged values that are not known smis or booleans require a | 
| // deoptimization environment. If the instruction is generic no | 
| @@ -1767,6 +1778,8 @@ LInstruction* LChunkBuilder::DoCompareNumericAndBranch( | 
| LInstruction* LChunkBuilder::DoCompareObjectEqAndBranch( | 
| HCompareObjectEqAndBranch* instr) { | 
| + LInstruction* goto_instr = CheckElideControlInstruction(instr); | 
| + if (goto_instr != NULL) return goto_instr; | 
| LOperand* left = UseRegisterAtStart(instr->left()); | 
| LOperand* right = UseRegisterAtStart(instr->right()); | 
| return new(zone()) LCmpObjectEqAndBranch(left, right); |