Commit 262c8bdd authored by vegorov@chromium.org's avatar vegorov@chromium.org

Always create HArgumentsObject on function entry.

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
parent 0ab3fb8b
......@@ -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());
}
......
......@@ -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);
......
......@@ -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);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment