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

Unified Diff: src/hydrogen.cc

Issue 5990005: Optimize instanceof further... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 10 years 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
Index: src/hydrogen.cc
===================================================================
--- src/hydrogen.cc (revision 6109)
+++ src/hydrogen.cc (working copy)
@@ -4847,7 +4847,42 @@
TypeInfo info = oracle()->CompareType(expr, TypeFeedbackOracle::RESULT);
HInstruction* instr = NULL;
if (op == Token::INSTANCEOF) {
- instr = new HInstanceOf(left, right);
+ // Check to see if the rhs of the instanceof is a global function not
+ // residing in new space. If it is the assumption used for optimization is
Mads Ager (chromium) 2011/01/04 17:25:58 Simplify to: If it is we assume that the function
Søren Thygesen Gjesse 2011/01/05 09:28:00 Done.
+ // that the function most likely will stay the same.
+ Handle<JSFunction> target = Handle<JSFunction>::null();
+ Variable* var = expr->right()->AsVariableProxy()->AsVariable();
+ bool global_function = (var != NULL) && var->is_global() && !var->is_this();
+ CompilationInfo* info = graph()->info();
+ if (global_function &&
+ info->has_global_object() &&
+ !info->global_object()->IsAccessCheckNeeded()) {
+ Handle<String> name = var->name();
+ Handle<GlobalObject> global(info->global_object());
+ Handle<JSGlobalPropertyCell> cell = Handle<JSGlobalPropertyCell>::null();
Mads Ager (chromium) 2011/01/04 17:25:58 Do you need the cell declaration out here? Can't y
Søren Thygesen Gjesse 2011/01/05 09:28:00 Don't need the cell at all, can just use lookup.Ge
+ LookupResult lookup;
+ global->Lookup(*name, &lookup);
+ if (lookup.IsProperty() && lookup.type() == NORMAL) {
+ cell = Handle<JSGlobalPropertyCell>(global->GetPropertyCell(&lookup));
+ if (cell->value()->IsJSFunction()) {
+ Handle<JSFunction> candidate(JSFunction::cast(cell->value()));
+ // If the function is in new space we assume it's more likely to
+ // change and thus prefer the general IC code.
+ if (!Heap::InNewSpace(*candidate)) {
+ target = candidate;
+ }
+ }
+ }
+ }
+
+ // If the traget is not null we have found a known global function that is
Mads Ager (chromium) 2011/01/04 17:25:58 traget -> target
Søren Thygesen Gjesse 2011/01/05 09:28:00 Done.
+ // assumed to stay the same for this instanceof.
+ if (target.is_null()) {
+ instr = new HInstanceOf(left, right);
+ } else {
+ AddInstruction(new HCheckFunction(right, target));
+ instr = new HInstanceOfKnownGlobal(left, target);
+ }
} else if (op == Token::IN) {
BAILOUT("Unsupported comparison: in");
} else if (info.IsNonPrimitive()) {
« no previous file with comments | « src/code-stubs.h ('k') | src/hydrogen-instructions.h » ('j') | src/ia32/code-stubs-ia32.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698