Reviewers: Hannes Payer,
Message:
PTAL
Description:
Refactor turning polymorphic loads into monomorphic loads
- remove special code for polymorphic loading of array length
- use it in VisitCountOperation
BUG=
Please review this at https://chromiumcodereview.appspot.com/16948005/
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
3d0d5505aea05800177fdce62d85f9cafe7dcaef..1c1a126e403a59aca4895b4142c03b84d0e8c1a9
100644
--- a/src/hydrogen.cc
+++ b/src/hydrogen.cc
@@ -6316,43 +6316,13 @@ HInstruction*
HOptimizedGraphBuilder::BuildStoreNamedMonomorphic(
}
-bool HOptimizedGraphBuilder::HandlePolymorphicArrayLengthLoad(
+HInstruction* HOptimizedGraphBuilder::LoadPolymorphicAsMonomorphic(
Property* expr,
HValue* object,
SmallMapList* types,
Handle<String> name) {
- if (!name->Equals(isolate()->heap()->length_string())) return false;
-
- for (int i = 0; i < types->length(); i++) {
- if (types->at(i)->instance_type() != JS_ARRAY_TYPE) return false;
- }
-
- BuildCheckNonSmi(object);
-
- HInstruction* typecheck =
- AddInstruction(HCheckMaps::New(object, types, zone()));
- HInstruction* instr = new(zone())
- HLoadNamedField(object, HObjectAccess::ForArrayLength(), typecheck);
-
- instr->set_position(expr->position());
- ast_context()->ReturnInstruction(instr, expr->id());
- return true;
-}
-
-
-void HOptimizedGraphBuilder::HandlePolymorphicLoadNamedField(Property*
expr,
- HValue* object,
- SmallMapList* types,
- Handle<String> name) {
-
- if (HandlePolymorphicArrayLengthLoad(expr, object, types, name))
- return;
-
- BuildCheckNonSmi(object);
-
// Use monomorphic load if property lookup results in the same field
index
// for all maps. Requires special map check on the set of all handled
maps.
- HInstruction* instr = NULL;
LookupResult lookup(isolate());
int count;
Representation representation = Representation::None();
@@ -6383,11 +6353,22 @@ void
HOptimizedGraphBuilder::HandlePolymorphicLoadNamedField(Property* expr,
}
}
- if (count == types->length()) {
- // Everything matched; can use monomorphic load.
- AddInstruction(HCheckMaps::New(object, types, zone()));
- instr = BuildLoadNamedField(object, access, representation);
- } else {
+ if (count != types->length()) return false;
+
+ // Everything matched; can use monomorphic load.
+ AddInstruction(HCheckMaps::New(object, types, zone()));
+ return BuildLoadNamedField(object, access, representation);
+}
+
+
+void HOptimizedGraphBuilder::HandlePolymorphicLoadNamedField(Property*
expr,
+ HValue* object,
+ SmallMapList* types,
+ Handle<String> name) {
+
+ BuildCheckNonSmi(object);
+ HInstruction* instr = LoadPolymorphicAsMonomorphic(expr, object, types,
name);
+ if (instr == NULL) {
// Something did not match; must use a polymorphic load.
HValue* context = environment()->LookupContext();
instr = new(zone()) HLoadNamedFieldPolymorphic(
@@ -6967,6 +6948,8 @@ HInstruction*
HOptimizedGraphBuilder::BuildLoadNamedGeneric(
Property* expr) {
if (expr->IsUninitialized()) {
AddSoftDeoptimize();
+ } else {
+ // OS::DebugBreak();
}
HValue* context = environment()->LookupContext();
return new(zone()) HLoadNamedGeneric(context, object, name);
@@ -9265,10 +9248,11 @@ void
HOptimizedGraphBuilder::VisitCountOperation(CountOperation* expr) {
Handle<String> name = prop->key()->AsLiteral()->AsPropertyName();
Handle<Map> map;
- HInstruction* load;
+ HInstruction* load = NULL;
bool monomorphic = prop->IsMonomorphic();
+ SmallMapList* types = prop->GetReceiverTypes();
if (monomorphic) {
- map = prop->GetReceiverTypes()->first();
+ map = types->first();
if (map->is_dictionary_map()) monomorphic = false;
}
if (monomorphic) {
@@ -9279,9 +9263,10 @@ void
HOptimizedGraphBuilder::VisitCountOperation(CountOperation* expr) {
} else {
load = BuildLoadNamedMonomorphic(object, name, prop, map);
}
- } else {
- load = BuildLoadNamedGeneric(object, name, prop);
+ } else if (types != NULL && types->length() > 1) {
+ load = LoadPolymorphicAsMonomorphic(prop, object, types, name);
}
+ if (load == NULL) load = BuildLoadNamedGeneric(object, name, prop);
PushAndAdd(load);
if (load->HasObservableSideEffects()) {
AddSimulate(prop->LoadId(), REMOVABLE_SIMULATE);
Index: src/hydrogen.h
diff --git a/src/hydrogen.h b/src/hydrogen.h
index
36807755341ca40fa245546f7348f9dc4d3dc41f..6f916877003fcd3e71c3c146edba8ef2b701d5e6
100644
--- a/src/hydrogen.h
+++ b/src/hydrogen.h
@@ -1701,10 +1701,10 @@ class HOptimizedGraphBuilder: public HGraphBuilder,
public AstVisitor {
HValue* object,
SmallMapList* types,
Handle<String> name);
- bool HandlePolymorphicArrayLengthLoad(Property* expr,
- HValue* object,
- SmallMapList* types,
- Handle<String> name);
+ HInstruction* LoadPolymorphicAsMonomorphic(Property* expr,
+ HValue* object,
+ SmallMapList* types,
+ Handle<String> name);
void HandlePolymorphicStoreNamedField(Assignment* expr,
HValue* object,
HValue* value,
--
--
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.