Always create HArgumentsObject on function entry.
authorvegorov@chromium.org <vegorov@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Tue, 13 Mar 2012 14:45:03 +0000 (14:45 +0000)
committervegorov@chromium.org <vegorov@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Tue, 13 Mar 2012 14:45:03 +0000 (14:45 +0000)
We do not know if we are going to need it and creating it lazyly might cause us to insert it at the block that does not dominate all uses.

R=mstarzinger@chromium.org
TEST=mjsunit/compiler/inline-arguments.js

Review URL: https://chromiumcodereview.appspot.com/9692046

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@11024 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/hydrogen.cc
src/hydrogen.h
test/mjsunit/compiler/inline-arguments.js

index 943d505..874644f 100644 (file)
@@ -2613,6 +2613,10 @@ void HGraphBuilder::SetUpScope(Scope* scope) {
   AddInstruction(undefined_constant);
   graph_->set_undefined_constant(undefined_constant);
 
+  HArgumentsObject* object = new(zone()) HArgumentsObject;
+  AddInstruction(object);
+  graph()->SetArgumentsObject(object);
+
   // Set the initial values of parameters including "this".  "This" has
   // parameter index 0.
   ASSERT_EQ(scope->num_parameters() + 1, environment()->parameter_count());
@@ -2640,11 +2644,6 @@ void HGraphBuilder::SetUpScope(Scope* scope) {
       return Bailout("context-allocated arguments");
     }
 
-    if (!graph()->HasArgumentsObject()) {
-      HArgumentsObject* object = new(zone()) HArgumentsObject;
-      AddInstruction(object);
-      graph()->SetArgumentsObject(object);
-    }
     environment()->Bind(scope->arguments(),
                         graph()->GetArgumentsObject());
   }
@@ -5339,11 +5338,6 @@ bool HGraphBuilder::TryInline(CallKind call_kind,
   // If the function uses arguments object create and bind one.
   if (function->scope()->arguments() != NULL) {
     ASSERT(function->scope()->arguments()->IsStackAllocated());
-    if (!graph()->HasArgumentsObject()) {
-      HArgumentsObject* object = new(zone()) HArgumentsObject;
-      AddInstruction(object);
-      graph()->SetArgumentsObject(object);
-    }
     environment()->Bind(function->scope()->arguments(),
                         graph()->GetArgumentsObject());
   }
index cb39609..6cc06c6 100644 (file)
@@ -293,7 +293,6 @@ class HGraph: public ZoneObject {
   HArgumentsObject* GetArgumentsObject() const {
     return arguments_object_.get();
   }
-  bool HasArgumentsObject() const { return arguments_object_.is_set(); }
 
   void SetArgumentsObject(HArgumentsObject* object) {
     arguments_object_.set(object);
index b79f59c..9712b2d 100644 (file)
@@ -54,3 +54,29 @@ A.prototype.X.apply = function (receiver, args) {
   return Function.prototype.apply.call(this, receiver, args);
 };
 a.Z(4,5,6);
+
+
+// Ensure that HArgumentsObject is inserted in a correct place
+// and dominates all uses.
+function F1() { }
+function F2() { F1.apply(this, arguments); }
+function F3(x, y) {
+  if (x) {
+    F2(y);
+  }
+}
+
+function F31() {
+  return F1.apply(this, arguments);
+}
+
+function F4() {
+  F3(true, false);
+  return F31(1);
+}
+
+F4(1);
+F4(1);
+F4(1);
+%OptimizeFunctionOnNextCall(F4);
+F4(1);