From: bmeurer@chromium.org Date: Wed, 20 Nov 2013 12:00:57 +0000 (+0000) Subject: Make BuildBinaryOperation use ReturnValue instead of ReturnInstruction. X-Git-Tag: upstream/4.7.83~11647 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=defee14d76c69f28c84113f25a29e46d5e7bc93a;p=platform%2Fupstream%2Fv8.git Make BuildBinaryOperation use ReturnValue instead of ReturnInstruction. R=svenpanne@chromium.org Review URL: https://codereview.chromium.org/78183002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17914 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/code-stubs-hydrogen.cc b/src/code-stubs-hydrogen.cc index a992dcb..62e19e1 100644 --- a/src/code-stubs-hydrogen.cc +++ b/src/code-stubs-hydrogen.cc @@ -896,17 +896,17 @@ HValue* CodeStubGraphBuilder::BuildCodeInitializedStub() { if_leftisstring.If(left); if_leftisstring.Then(); { - Push(AddInstruction(BuildBinaryOperation( + Push(BuildBinaryOperation( stub->operation(), left, right, handle(Type::String(), isolate()), right_type, - result_type, stub->fixed_right_arg(), true))); + result_type, stub->fixed_right_arg(), true)); } if_leftisstring.Else(); { - Push(AddInstruction(BuildBinaryOperation( + Push(BuildBinaryOperation( stub->operation(), left, right, left_type, right_type, result_type, - stub->fixed_right_arg(), true))); + stub->fixed_right_arg(), true)); } if_leftisstring.End(); result = Pop(); @@ -915,26 +915,26 @@ HValue* CodeStubGraphBuilder::BuildCodeInitializedStub() { if_rightisstring.If(right); if_rightisstring.Then(); { - Push(AddInstruction(BuildBinaryOperation( + Push(BuildBinaryOperation( stub->operation(), left, right, left_type, handle(Type::String(), isolate()), - result_type, stub->fixed_right_arg(), true))); + result_type, stub->fixed_right_arg(), true)); } if_rightisstring.Else(); { - Push(AddInstruction(BuildBinaryOperation( + Push(BuildBinaryOperation( stub->operation(), left, right, left_type, right_type, result_type, - stub->fixed_right_arg(), true))); + stub->fixed_right_arg(), true)); } if_rightisstring.End(); result = Pop(); } } else { - result = AddInstruction(BuildBinaryOperation( + result = BuildBinaryOperation( stub->operation(), left, right, left_type, right_type, result_type, - stub->fixed_right_arg(), true)); + stub->fixed_right_arg(), true); } // If we encounter a generic argument, the number conversion is diff --git a/src/hydrogen.cc b/src/hydrogen.cc index a57166f..8d73c1e 100644 --- a/src/hydrogen.cc +++ b/src/hydrogen.cc @@ -5948,12 +5948,7 @@ void HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) { HValue* right = Pop(); HValue* left = Pop(); - HInstruction* instr = BuildBinaryOperation(operation, left, right); - AddInstruction(instr); - Push(instr); - if (instr->HasObservableSideEffects()) { - Add(operation->id(), REMOVABLE_SIMULATE); - } + Push(BuildBinaryOperation(operation, left, right)); BuildStore(expr, prop, expr->id(), expr->AssignmentId(), expr->IsUninitialized()); } else { @@ -8589,7 +8584,7 @@ HValue* HGraphBuilder::TruncateToNumber(HValue* value, Handle* expected) { } -HInstruction* HOptimizedGraphBuilder::BuildBinaryOperation( +HValue* HOptimizedGraphBuilder::BuildBinaryOperation( BinaryOperation* expr, HValue* left, HValue* right) { @@ -8598,12 +8593,22 @@ HInstruction* HOptimizedGraphBuilder::BuildBinaryOperation( Handle result_type = expr->bounds().lower; Maybe fixed_right_arg = expr->fixed_right_arg(); - return HGraphBuilder::BuildBinaryOperation(expr->op(), left, right, - left_type, right_type, result_type, fixed_right_arg); + HValue* result = HGraphBuilder::BuildBinaryOperation( + expr->op(), left, right, left_type, right_type, + result_type, fixed_right_arg); + // Add a simulate after instructions with observable side effects, and + // after phis, which are the result of BuildBinaryOperation when we + // inlined some complex subgraph. + if (result->HasObservableSideEffects() || result->IsPhi()) { + Push(result); + Add(expr->id(), REMOVABLE_SIMULATE); + Drop(1); + } + return result; } -HInstruction* HGraphBuilder::BuildBinaryOperation( +HValue* HGraphBuilder::BuildBinaryOperation( Token::Value op, HValue* left, HValue* right, @@ -8664,7 +8669,7 @@ HInstruction* HGraphBuilder::BuildBinaryOperation( HValue* function = AddLoadJSBuiltin(Builtins::STRING_ADD_RIGHT); Add(left); Add(right); - return NewUncasted(function, 2); + return AddUncasted(function, 2); } // Convert right argument as necessary. @@ -8676,10 +8681,10 @@ HInstruction* HGraphBuilder::BuildBinaryOperation( HValue* function = AddLoadJSBuiltin(Builtins::STRING_ADD_LEFT); Add(left); Add(right); - return NewUncasted(function, 2); + return AddUncasted(function, 2); } - return NewUncasted(left, right, STRING_ADD_CHECK_NONE); + return AddUncasted(left, right, STRING_ADD_CHECK_NONE); } if (binop_stub) { @@ -8700,51 +8705,51 @@ HInstruction* HGraphBuilder::BuildBinaryOperation( HValue* function = AddLoadJSBuiltin(BinaryOpIC::TokenToJSBuiltin(op)); Add(left); Add(right); - instr = NewUncasted(function, 2); + instr = AddUncasted(function, 2); } else { switch (op) { case Token::ADD: - instr = NewUncasted(left, right); + instr = AddUncasted(left, right); break; case Token::SUB: - instr = NewUncasted(left, right); + instr = AddUncasted(left, right); break; case Token::MUL: - instr = NewUncasted(left, right); + instr = AddUncasted(left, right); break; case Token::MOD: - instr = NewUncasted(left, right, fixed_right_arg); + instr = AddUncasted(left, right, fixed_right_arg); break; case Token::DIV: - instr = NewUncasted(left, right); + instr = AddUncasted(left, right); break; case Token::BIT_XOR: case Token::BIT_AND: - instr = NewUncasted(op, left, right); + instr = AddUncasted(op, left, right); break; case Token::BIT_OR: { HValue* operand, *shift_amount; if (left_type->Is(Type::Signed32()) && right_type->Is(Type::Signed32()) && MatchRotateRight(left, right, &operand, &shift_amount)) { - instr = NewUncasted(operand, shift_amount); + instr = AddUncasted(operand, shift_amount); } else { - instr = NewUncasted(op, left, right); + instr = AddUncasted(op, left, right); } break; } case Token::SAR: - instr = NewUncasted(left, right); + instr = AddUncasted(left, right); break; case Token::SHR: - instr = NewUncasted(left, right); + instr = AddUncasted(left, right); if (FLAG_opt_safe_uint32_operations && instr->IsShr() && CanBeZero(right)) { graph()->RecordUint32Instruction(instr); } break; case Token::SHL: - instr = NewUncasted(left, right); + instr = AddUncasted(left, right); break; default: UNREACHABLE(); @@ -8920,12 +8925,12 @@ void HOptimizedGraphBuilder::VisitArithmeticExpression(BinaryOperation* expr) { SetSourcePosition(expr->position()); HValue* right = Pop(); HValue* left = Pop(); - HInstruction* instr = BuildBinaryOperation(expr, left, right); - if (FLAG_emit_opt_code_positions && instr->IsBinaryOperation()) { - HBinaryOperation::cast(instr)->SetOperandPositions( + HValue* result = BuildBinaryOperation(expr, left, right); + if (FLAG_emit_opt_code_positions && result->IsBinaryOperation()) { + HBinaryOperation::cast(result)->SetOperandPositions( zone(), expr->left()->position(), expr->right()->position()); } - return ast_context()->ReturnInstruction(instr, expr->id()); + return ast_context()->ReturnValue(result); } diff --git a/src/hydrogen.h b/src/hydrogen.h index 723bb44..a117c55 100644 --- a/src/hydrogen.h +++ b/src/hydrogen.h @@ -1339,14 +1339,14 @@ class HGraphBuilder { HValue** operand, HValue** shift_amount); - HInstruction* BuildBinaryOperation(Token::Value op, - HValue* left, - HValue* right, - Handle left_type, - Handle right_type, - Handle result_type, - Maybe fixed_right_arg, - bool binop_stub = false); + HValue* BuildBinaryOperation(Token::Value op, + HValue* left, + HValue* right, + Handle left_type, + Handle right_type, + Handle result_type, + Maybe fixed_right_arg, + bool binop_stub = false); HLoadNamedField* AddLoadFixedArrayLength(HValue *object); @@ -2275,9 +2275,9 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor { HInstruction* BuildStringCharCodeAt(HValue* string, HValue* index); - HInstruction* BuildBinaryOperation(BinaryOperation* expr, - HValue* left, - HValue* right); + HValue* BuildBinaryOperation(BinaryOperation* expr, + HValue* left, + HValue* right); HInstruction* BuildIncrement(bool returns_original_input, CountOperation* expr); HInstruction* BuildLoadKeyedGeneric(HValue* object,