Revision: 18343
Author:   [email protected]
Date:     Wed Dec 18 10:38:58 2013 UTC
Log:      Collect type information based on stack allocated values for OSR.

[email protected], [email protected]

Review URL: https://codereview.chromium.org/100093004
http://code.google.com/p/v8/source/detail?r=18343

Modified:
 /branches/bleeding_edge/src/typing.cc
 /branches/bleeding_edge/src/typing.h
 /branches/bleeding_edge/src/utils.h

=======================================
--- /branches/bleeding_edge/src/typing.cc       Thu Dec 12 14:57:00 2013 UTC
+++ /branches/bleeding_edge/src/typing.cc       Wed Dec 18 10:38:58 2013 UTC
@@ -27,6 +27,8 @@

 #include "typing.h"

+#include "frames.h"
+#include "frames-inl.h"
 #include "parser.h"  // for CompileTimeValue; TODO(rossberg): should move
 #include "scopes.h"

@@ -68,6 +70,75 @@

 #undef RECURSE

+
+Effect AstTyper::ObservedOnStack(Object* value) {
+  Type* lower = Type::OfCurrently(Handle<Object>(value, isolate()));
+  return Effect(Bounds(lower, Type::Any(), isolate()));
+}
+
+
+#ifdef OBJECT_PRINT
+ static void PrintObserved(Variable* var, Object* value, Handle<Type> type) {
+    PrintF("  observed %s ", var->IsParameter() ? "param" : "local");
+    var->name()->Print();
+    PrintF(" : ");
+    value->ShortPrint();
+    PrintF(" -> ");
+    type->TypePrint();
+  }
+#endif  // OBJECT_PRINT
+
+
+void AstTyper::ObserveTypesAtOsrEntry(IterationStatement* stmt) {
+  if (stmt->OsrEntryId() != info_->osr_ast_id()) return;
+
+  DisallowHeapAllocation no_gc;
+  JavaScriptFrameIterator it(isolate());
+  JavaScriptFrame* frame = it.frame();
+  Scope* scope = info_->scope();
+
+ // Assert that the frame on the stack belongs to the function we want to OSR.
+  ASSERT_EQ(*info_->closure(), frame->function());
+
+  int params = scope->num_parameters();
+  int locals = scope->StackLocalCount();
+
+  // Use sequential composition to achieve desired narrowing.
+  // The receiver is a parameter with index -1.
+  store_.Seq(parameter_index(-1), ObservedOnStack(frame->receiver()));
+  for (int i = 0; i < params; i++) {
+ store_.Seq(parameter_index(i), ObservedOnStack(frame->GetParameter(i)));
+  }
+
+  for (int i = 0; i < locals; i++) {
+ store_.Seq(stack_local_index(i), ObservedOnStack(frame->GetExpression(i)));
+  }
+
+#ifdef OBJECT_PRINT
+  if (FLAG_trace_osr && FLAG_print_scopes) {
+    PrintObserved(scope->receiver(),
+                  frame->receiver(),
+                  store_.LookupBounds(parameter_index(-1)).lower);
+
+    for (int i = 0; i < params; i++) {
+      PrintObserved(scope->parameter(i),
+                    frame->GetParameter(i),
+                    store_.LookupBounds(parameter_index(i)).lower);
+    }
+
+    ZoneList<Variable*> local_vars(locals, zone());
+    ZoneList<Variable*> context_vars(scope->ContextLocalCount(), zone());
+    scope->CollectStackAndContextLocals(&local_vars, &context_vars);
+    for (int i = 0; i < locals; i++) {
+      PrintObserved(local_vars.at(i),
+                    frame->GetExpression(i),
+                    store_.LookupBounds(stack_local_index(i)).lower);
+    }
+  }
+#endif  // OBJECT_PRINT
+}
+
+
 #define RECURSE(call)                \
   do {                               \
     ASSERT(!HasStackOverflow());     \
@@ -221,6 +292,7 @@
// computing the set of variables assigned in only some of the origins of the
   // control transfer (such as the loop body here).
   store_.Forget();  // Control may transfer here via looping or 'continue'.
+  ObserveTypesAtOsrEntry(stmt);
   RECURSE(Visit(stmt->body()));
   RECURSE(Visit(stmt->cond()));
   store_.Forget();  // Control may transfer here via 'break'.
@@ -235,6 +307,7 @@

   store_.Forget();  // Control may transfer here via looping or 'continue'.
   RECURSE(Visit(stmt->cond()));
+  ObserveTypesAtOsrEntry(stmt);
   RECURSE(Visit(stmt->body()));
store_.Forget(); // Control may transfer here via termination or 'break'.
 }
@@ -251,6 +324,7 @@

     RECURSE(Visit(stmt->cond()));
   }
+  ObserveTypesAtOsrEntry(stmt);
   RECURSE(Visit(stmt->body()));
   if (stmt->next() != NULL) {
     store_.Forget();  // Control may transfer here via 'continue'.
@@ -267,6 +341,7 @@

   RECURSE(Visit(stmt->enumerable()));
   store_.Forget();  // Control may transfer here via looping or 'continue'.
+  ObserveTypesAtOsrEntry(stmt);
   RECURSE(Visit(stmt->body()));
   store_.Forget();  // Control may transfer here via 'break'.
 }
=======================================
--- /branches/bleeding_edge/src/typing.h        Thu Dec 12 15:19:57 2013 UTC
+++ /branches/bleeding_edge/src/typing.h        Wed Dec 18 10:38:58 2013 UTC
@@ -58,6 +58,9 @@
  private:
   explicit AstTyper(CompilationInfo* info);

+  Effect ObservedOnStack(Object* value);
+  void ObserveTypesAtOsrEntry(IterationStatement* stmt);
+
   static const int kNoVar = INT_MIN;
   typedef v8::internal::Effects<int, kNoVar> Effects;
   typedef v8::internal::NestedEffects<int, kNoVar> Store;
@@ -81,13 +84,16 @@
     return store_.Top();
   }
   void ExitEffects() { store_ = store_.Pop(); }
+
+  int parameter_index(int index) { return -index - 2; }
+  int stack_local_index(int index) { return index; }

   int variable_index(Variable* var) {
     // Stack locals have the range [0 .. l]
     // Parameters have the range [-1 .. p]
     // We map this to [-p-2 .. -1, 0 .. l]
-    return var->IsStackLocal() ? var->index() :
-           var->IsParameter() ? -var->index() - 2 : kNoVar;
+    return var->IsStackLocal() ? stack_local_index(var->index()) :
+           var->IsParameter() ? parameter_index(var->index()) : kNoVar;
   }

   void VisitDeclarations(ZoneList<Declaration*>* declarations);
=======================================
--- /branches/bleeding_edge/src/utils.h Wed Nov  6 13:20:14 2013 UTC
+++ /branches/bleeding_edge/src/utils.h Wed Dec 18 10:38:58 2013 UTC
@@ -1118,6 +1118,7 @@

   bool IsNone() const { return id_ == kNoneId; }
bool operator==(const BailoutId& other) const { return id_ == other.id_; } + bool operator!=(const BailoutId& other) const { return id_ != other.id_; }

  private:
   static const int kNoneId = -1;

--
--
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.

Reply via email to