Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(472)

Unified Diff: src/hydrogen.cc

Issue 78183002: Make BuildBinaryOperation use ReturnValue instead of ReturnInstruction. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Add comment. Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/hydrogen.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/hydrogen.cc
diff --git a/src/hydrogen.cc b/src/hydrogen.cc
index 22da9477e53608ce1b4df08357bfce25960e2e53..282aff6696180475bcf6e0f6742e2e0bb57b7a91 100644
--- a/src/hydrogen.cc
+++ b/src/hydrogen.cc
@@ -5934,12 +5934,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<HSimulate>(operation->id(), REMOVABLE_SIMULATE);
- }
+ Push(BuildBinaryOperation(operation, left, right));
BuildStore(expr, prop, expr->id(),
expr->AssignmentId(), expr->IsUninitialized());
} else {
@@ -8575,7 +8570,7 @@ HValue* HGraphBuilder::TruncateToNumber(HValue* value, Handle<Type>* expected) {
}
-HInstruction* HOptimizedGraphBuilder::BuildBinaryOperation(
+HValue* HOptimizedGraphBuilder::BuildBinaryOperation(
BinaryOperation* expr,
HValue* left,
HValue* right) {
@@ -8584,12 +8579,22 @@ HInstruction* HOptimizedGraphBuilder::BuildBinaryOperation(
Handle<Type> result_type = expr->bounds().lower;
Maybe<int> 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<HSimulate>(expr->id(), REMOVABLE_SIMULATE);
+ Drop(1);
+ }
+ return result;
}
-HInstruction* HGraphBuilder::BuildBinaryOperation(
+HValue* HGraphBuilder::BuildBinaryOperation(
Token::Value op,
HValue* left,
HValue* right,
@@ -8654,7 +8659,7 @@ HInstruction* HGraphBuilder::BuildBinaryOperation(
HValue* function = AddLoadJSBuiltin(Builtins::STRING_ADD_RIGHT);
Add<HPushArgument>(left);
Add<HPushArgument>(right);
- return NewUncasted<HInvokeFunction>(function, 2);
+ return AddUncasted<HInvokeFunction>(function, 2);
}
// Convert right argument as necessary.
@@ -8666,10 +8671,10 @@ HInstruction* HGraphBuilder::BuildBinaryOperation(
HValue* function = AddLoadJSBuiltin(Builtins::STRING_ADD_LEFT);
Add<HPushArgument>(left);
Add<HPushArgument>(right);
- return NewUncasted<HInvokeFunction>(function, 2);
+ return AddUncasted<HInvokeFunction>(function, 2);
}
- return NewUncasted<HStringAdd>(left, right, STRING_ADD_CHECK_NONE);
+ return AddUncasted<HStringAdd>(left, right, STRING_ADD_CHECK_NONE);
}
if (binop_stub) {
@@ -8690,51 +8695,51 @@ HInstruction* HGraphBuilder::BuildBinaryOperation(
HValue* function = AddLoadJSBuiltin(BinaryOpIC::TokenToJSBuiltin(op));
Add<HPushArgument>(left);
Add<HPushArgument>(right);
- instr = NewUncasted<HInvokeFunction>(function, 2);
+ instr = AddUncasted<HInvokeFunction>(function, 2);
} else {
switch (op) {
case Token::ADD:
- instr = NewUncasted<HAdd>(left, right);
+ instr = AddUncasted<HAdd>(left, right);
break;
case Token::SUB:
- instr = NewUncasted<HSub>(left, right);
+ instr = AddUncasted<HSub>(left, right);
break;
case Token::MUL:
- instr = NewUncasted<HMul>(left, right);
+ instr = AddUncasted<HMul>(left, right);
break;
case Token::MOD:
- instr = NewUncasted<HMod>(left, right, fixed_right_arg);
+ instr = AddUncasted<HMod>(left, right, fixed_right_arg);
break;
case Token::DIV:
- instr = NewUncasted<HDiv>(left, right);
+ instr = AddUncasted<HDiv>(left, right);
break;
case Token::BIT_XOR:
case Token::BIT_AND:
- instr = NewUncasted<HBitwise>(op, left, right);
+ instr = AddUncasted<HBitwise>(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<HRor>(operand, shift_amount);
+ instr = AddUncasted<HRor>(operand, shift_amount);
} else {
- instr = NewUncasted<HBitwise>(op, left, right);
+ instr = AddUncasted<HBitwise>(op, left, right);
}
break;
}
case Token::SAR:
- instr = NewUncasted<HSar>(left, right);
+ instr = AddUncasted<HSar>(left, right);
break;
case Token::SHR:
- instr = NewUncasted<HShr>(left, right);
+ instr = AddUncasted<HShr>(left, right);
if (FLAG_opt_safe_uint32_operations && instr->IsShr() &&
CanBeZero(right)) {
graph()->RecordUint32Instruction(instr);
}
break;
case Token::SHL:
- instr = NewUncasted<HShl>(left, right);
+ instr = AddUncasted<HShl>(left, right);
break;
default:
UNREACHABLE();
@@ -8910,12 +8915,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);
}
« no previous file with comments | « src/hydrogen.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698