| Index: src/x64/lithium-x64.cc
|
| diff --git a/src/x64/lithium-x64.cc b/src/x64/lithium-x64.cc
|
| index b4c716768aefac77b0757e0b25ca3a49787b0af7..5ee624f4b6fedd39b96b6c12634d05bd50e67ea1 100644
|
| --- a/src/x64/lithium-x64.cc
|
| +++ b/src/x64/lithium-x64.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(i)));
|
| + dummy->set_hydrogen_value(current);
|
| + chunk_->AddInstruction(dummy, current_block_);
|
| + }
|
| + } else {
|
| + instr = current->CompileToLithium(this);
|
| + }
|
|
|
| if (instr != NULL) {
|
| // Associate the hydrogen instruction first, since we may need it for
|
| @@ -994,7 +1009,7 @@ LEnvironment* LChunkBuilder::CreateEnvironment(
|
|
|
|
|
| LInstruction* LChunkBuilder::DoGoto(HGoto* instr) {
|
| - return new(zone()) LGoto(instr->FirstSuccessor()->block_id());
|
| + return new(zone()) LGoto(instr->FirstSuccessor());
|
| }
|
|
|
|
|
| @@ -1004,16 +1019,10 @@ LInstruction* LChunkBuilder::DoDebugBreak(HDebugBreak* instr) {
|
|
|
|
|
| LInstruction* LChunkBuilder::DoBranch(HBranch* instr) {
|
| - HValue* value = instr->value();
|
| - if (value->EmitAtUses()) {
|
| - ASSERT(value->IsConstant());
|
| - ASSERT(!value->representation().IsDouble());
|
| - 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
|
| @@ -1643,6 +1652,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 = UseRegisterOrConstantAtStart(instr->right());
|
| return new(zone()) LCmpObjectEqAndBranch(left, right);
|
|
|