From 262c8bddd5bd2e48f1ffab164872776656560d70 Mon Sep 17 00:00:00 2001 From: "vegorov@chromium.org" Date: Tue, 13 Mar 2012 14:45:03 +0000 Subject: [PATCH] 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 --- src/hydrogen.cc | 14 ++++---------- src/hydrogen.h | 1 - test/mjsunit/compiler/inline-arguments.js | 26 ++++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/hydrogen.cc b/src/hydrogen.cc index 943d505..874644f 100644 --- a/src/hydrogen.cc +++ b/src/hydrogen.cc @@ -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()); } diff --git a/src/hydrogen.h b/src/hydrogen.h index cb39609..6cc06c6 100644 --- a/src/hydrogen.h +++ b/src/hydrogen.h @@ -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); diff --git a/test/mjsunit/compiler/inline-arguments.js b/test/mjsunit/compiler/inline-arguments.js index b79f59c..9712b2d 100644 --- a/test/mjsunit/compiler/inline-arguments.js +++ b/test/mjsunit/compiler/inline-arguments.js @@ -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); -- 2.7.4