Reviewers: danno, Sven Panne,
Message:
PTAL
Description:
Unify the Count Operation assignment with other assignments.
This does not enable inlining of setters (yet).
Please review this at https://chromiumcodereview.appspot.com/17432004/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files:
M src/hydrogen.h
M src/hydrogen.cc
Index: src/hydrogen.cc
diff --git a/src/hydrogen.cc b/src/hydrogen.cc
index
9d4fe2e50529e779b45cde69b4c3140274d8a3a5..c608498b34092735fcf681dbebe0bbde315bf673
100644
--- a/src/hydrogen.cc
+++ b/src/hydrogen.cc
@@ -6365,6 +6365,7 @@ bool
HOptimizedGraphBuilder::TryStorePolymorphicAsMonomorphic(
BailoutId assignment_id,
HValue* object,
HValue* value,
+ HValue* result,
SmallMapList* types,
Handle<String> name) {
// Use monomorphic store if property lookup results in the same field
index
@@ -6412,10 +6413,12 @@ bool
HOptimizedGraphBuilder::TryStorePolymorphicAsMonomorphic(
store = BuildStoreNamedField(
object, name, value, types->at(count - 1), &lookup),
true);
+ if (result != value) Push(result);
Push(value);
store->set_position(position);
AddInstruction(store);
AddSimulate(assignment_id);
+ if (result != value) Drop(1);
ast_context()->ReturnValue(Pop());
return true;
}
@@ -6427,10 +6430,11 @@ void
HOptimizedGraphBuilder::HandlePolymorphicStoreNamedField(
BailoutId assignment_id,
HValue* object,
HValue* value,
+ HValue* result,
SmallMapList* types,
Handle<String> name) {
if (TryStorePolymorphicAsMonomorphic(
- position, assignment_id, object, value, types, name)) {
+ position, assignment_id, object, value, result, types, name)) {
return;
}
@@ -6461,7 +6465,10 @@ void
HOptimizedGraphBuilder::HandlePolymorphicStoreNamedField(
instr->set_position(position);
// Goto will add the HSimulate for the store.
AddInstruction(instr);
- if (!ast_context()->IsEffect()) Push(value);
+ if (!ast_context()->IsEffect()) {
+ if (value != result) Push(result);
+ Push(value);
+ }
current_block()->Goto(join);
set_current_block(if_false);
@@ -6479,7 +6486,10 @@ void
HOptimizedGraphBuilder::HandlePolymorphicStoreNamedField(
AddInstruction(instr);
if (join != NULL) {
- if (!ast_context()->IsEffect()) Push(value);
+ if (!ast_context()->IsEffect()) {
+ if (result != value) Push(result);
+ Push(value);
+ }
current_block()->Goto(join);
} else {
// The HSimulate for the store should not see the stored value in
@@ -6489,18 +6499,20 @@ void
HOptimizedGraphBuilder::HandlePolymorphicStoreNamedField(
if (ast_context()->IsEffect()) {
AddSimulate(id, REMOVABLE_SIMULATE);
} else {
+ if (result != value) Push(result);
Push(value);
AddSimulate(id, REMOVABLE_SIMULATE);
- Drop(1);
+ Drop(result != value ? 2 : 1);
}
}
- return ast_context()->ReturnValue(value);
+ return ast_context()->ReturnValue(result);
}
}
ASSERT(join != NULL);
join->SetJoinId(id);
set_current_block(join);
+ if (result != value) Drop(1);
if (!ast_context()->IsEffect()) ast_context()->ReturnValue(Pop());
}
@@ -6517,7 +6529,7 @@ void
HOptimizedGraphBuilder::HandlePropertyAssignment(Assignment* expr) {
HValue* object = environment()->ExpressionStackAt(1);
return BuildStoreNamed(expr, expr->id(), expr->position(),
- expr->AssignmentId(), prop, object, value);
+ expr->AssignmentId(), prop, object, value,
value);
} else {
// Keyed store.
CHECK_ALIVE(VisitForValue(prop->key()));
@@ -6582,7 +6594,8 @@ void
HOptimizedGraphBuilder::BuildStoreNamed(Expression* expr,
BailoutId assignment_id,
Property* prop,
HValue* object,
- HValue* value) {
+ HValue* value,
+ HValue* result) {
Literal* key = prop->key()->AsLiteral();
Handle<String> name = Handle<String>::cast(key->handle());
ASSERT(!name.is_null());
@@ -6600,7 +6613,8 @@ void
HOptimizedGraphBuilder::BuildStoreNamed(Expression* expr,
Handle<JSObject> holder;
if (LookupSetter(map, name, &setter, &holder)) {
AddCheckConstantFunction(holder, object, map);
- if (FLAG_inline_accessors &&
+ if (result == value &&
+ FLAG_inline_accessors &&
TryInlineSetter(setter, id, assignment_id, value)) {
return;
}
@@ -6615,22 +6629,23 @@ void
HOptimizedGraphBuilder::BuildStoreNamed(Expression* expr,
value,
map));
}
-
} else if (types != NULL && types->length() > 1) {
Drop(2);
return HandlePolymorphicStoreNamedField(
- id, position, assignment_id, object, value, types, name);
+ id, position, assignment_id, object, value, result, types, name);
} else {
Drop(2);
instr = BuildStoreNamedGeneric(object, name, value);
}
+ if (value != result) Push(result);
Push(value);
instr->set_position(position);
AddInstruction(instr);
if (instr->HasObservableSideEffects()) {
AddSimulate(assignment_id, REMOVABLE_SIMULATE);
}
+ if (value != result) Drop(1);
return ast_context()->ReturnValue(Pop());
}
@@ -6762,7 +6777,7 @@ void
HOptimizedGraphBuilder::HandleCompoundAssignment(Assignment* expr) {
}
return BuildStoreNamed(prop, expr->id(), expr->position(),
- expr->AssignmentId(), prop, object, instr);
+ expr->AssignmentId(), prop, object, instr,
instr);
} else {
// Keyed property.
CHECK_ALIVE(VisitForValue(prop->obj()));
@@ -9254,35 +9269,11 @@ void
HOptimizedGraphBuilder::VisitCountOperation(CountOperation* expr) {
}
after = BuildIncrement(returns_original_input, expr);
- input = Pop();
-
- HInstruction* store;
- if (!monomorphic || map->is_observed()) {
- // If we don't know the monomorphic type, do a generic store.
- CHECK_ALIVE(store = BuildStoreNamedGeneric(object, name, after));
- } else {
- Handle<JSFunction> setter;
- Handle<JSObject> holder;
- if (LookupSetter(map, name, &setter, &holder)) {
- store = BuildCallSetter(object, after, map, setter, holder);
- } else {
- CHECK_ALIVE(store = BuildStoreNamedMonomorphic(object,
- name,
- after,
- map));
- }
- }
- AddInstruction(store);
- // Overwrite the receiver in the bailout environment with the result
- // of the operation, and the placeholder with the original value if
- // necessary.
- environment()->SetExpressionStackAt(0, after);
- if (returns_original_input) environment()->SetExpressionStackAt(1,
input);
- if (store->HasObservableSideEffects()) {
- AddSimulate(expr->AssignmentId(), REMOVABLE_SIMULATE);
- }
+ HValue* result = returns_original_input ? Pop() : after;
+ return BuildStoreNamed(prop, expr->id(), expr->position(),
+ expr->AssignmentId(), prop, object, after,
result);
} else {
// Keyed property.
if (returns_original_input) Push(graph()->GetConstantUndefined());
Index: src/hydrogen.h
diff --git a/src/hydrogen.h b/src/hydrogen.h
index
6a49e5708de953eb5cb74e88906afe9526c18b79..4dce65558aaeef20003cf37ec19329d563d96b93
100644
--- a/src/hydrogen.h
+++ b/src/hydrogen.h
@@ -1709,12 +1709,14 @@ class HOptimizedGraphBuilder: public HGraphBuilder,
public AstVisitor {
BailoutId assignment_id,
HValue* object,
HValue* value,
+ HValue* result,
SmallMapList* types,
Handle<String> name);
bool TryStorePolymorphicAsMonomorphic(int position,
BailoutId assignment_id,
HValue* object,
HValue* value,
+ HValue* result,
SmallMapList* types,
Handle<String> name);
void HandlePolymorphicCallNamed(Call* expr,
@@ -1794,7 +1796,8 @@ class HOptimizedGraphBuilder: public HGraphBuilder,
public AstVisitor {
BailoutId assignment_id,
Property* prop,
HValue* object,
- HValue* value);
+ HValue* value,
+ HValue* result);
HInstruction* BuildStoreNamedField(HValue* object,
Handle<String> name,
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.