From: yangguo@chromium.org Date: Mon, 10 Jun 2013 11:17:48 +0000 (+0000) Subject: Fix parallel recompilation wrt initial object/array map dependency. X-Git-Tag: upstream/4.7.83~13937 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1594eca8ed9cd4dc532915722c9aacb83f24f15f;p=platform%2Fupstream%2Fv8.git Fix parallel recompilation wrt initial object/array map dependency. R=ulan@chromium.org BUG= Review URL: https://chromiumcodereview.appspot.com/16641002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15030 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc index d1d4fe0..d42ae72 100644 --- a/src/arm/lithium-codegen-arm.cc +++ b/src/arm/lithium-codegen-arm.cc @@ -93,12 +93,6 @@ void LCodeGen::FinishCode(Handle code) { transition_maps_.at(i)->AddDependentCode( DependentCode::kTransitionGroup, code); } - if (graph()->depends_on_empty_array_proto_elements()) { - isolate()->initial_object_prototype()->map()->AddDependentCode( - DependentCode::kElementsCantBeAddedGroup, code); - isolate()->initial_array_prototype()->map()->AddDependentCode( - DependentCode::kElementsCantBeAddedGroup, code); - } } diff --git a/src/hydrogen.h b/src/hydrogen.h index 00cd9be..eb6473a 100644 --- a/src/hydrogen.h +++ b/src/hydrogen.h @@ -402,13 +402,15 @@ class HGraph: public ZoneObject { } void MarkDependsOnEmptyArrayProtoElements() { + // Add map dependency if not already added. + if (depends_on_empty_array_proto_elements_) return; + isolate()->initial_object_prototype()->map()->AddDependentCompilationInfo( + DependentCode::kElementsCantBeAddedGroup, info()); + isolate()->initial_array_prototype()->map()->AddDependentCompilationInfo( + DependentCode::kElementsCantBeAddedGroup, info()); depends_on_empty_array_proto_elements_ = true; } - bool depends_on_empty_array_proto_elements() { - return depends_on_empty_array_proto_elements_; - } - void RecordUint32Instruction(HInstruction* instr) { if (uint32_instructions_ == NULL) { uint32_instructions_ = new(zone()) ZoneList(4, zone()); diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc index 5d1f46d..14657b9 100644 --- a/src/ia32/lithium-codegen-ia32.cc +++ b/src/ia32/lithium-codegen-ia32.cc @@ -115,12 +115,6 @@ void LCodeGen::FinishCode(Handle code) { transition_maps_.at(i)->AddDependentCode( DependentCode::kTransitionGroup, code); } - if (graph()->depends_on_empty_array_proto_elements()) { - isolate()->initial_object_prototype()->map()->AddDependentCode( - DependentCode::kElementsCantBeAddedGroup, code); - isolate()->initial_array_prototype()->map()->AddDependentCode( - DependentCode::kElementsCantBeAddedGroup, code); - } } diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc index fa97ee4..cafccec 100644 --- a/src/mips/lithium-codegen-mips.cc +++ b/src/mips/lithium-codegen-mips.cc @@ -93,12 +93,6 @@ void LCodeGen::FinishCode(Handle code) { transition_maps_.at(i)->AddDependentCode( DependentCode::kTransitionGroup, code); } - if (graph()->depends_on_empty_array_proto_elements()) { - isolate()->initial_object_prototype()->map()->AddDependentCode( - DependentCode::kElementsCantBeAddedGroup, code); - isolate()->initial_array_prototype()->map()->AddDependentCode( - DependentCode::kElementsCantBeAddedGroup, code); - } } diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc index 2d6e4cb..b07655d 100644 --- a/src/x64/lithium-codegen-x64.cc +++ b/src/x64/lithium-codegen-x64.cc @@ -98,12 +98,6 @@ void LCodeGen::FinishCode(Handle code) { transition_maps_.at(i)->AddDependentCode( DependentCode::kTransitionGroup, code); } - if (graph()->depends_on_empty_array_proto_elements()) { - isolate()->initial_object_prototype()->map()->AddDependentCode( - DependentCode::kElementsCantBeAddedGroup, code); - isolate()->initial_array_prototype()->map()->AddDependentCode( - DependentCode::kElementsCantBeAddedGroup, code); - } } diff --git a/test/mjsunit/parallel-initial-prototype-change.js b/test/mjsunit/parallel-initial-prototype-change.js new file mode 100644 index 0000000..5544beb --- /dev/null +++ b/test/mjsunit/parallel-initial-prototype-change.js @@ -0,0 +1,50 @@ +// Copyright 2013 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Flags: --allow-natives-syntax +// Flags: --parallel-recompilation --parallel-recompilation-delay=50 + +function assertUnoptimized(fun) { + assertTrue(%GetOptimizationStatus(fun) != 1); +} + +function f1(a, i) { + return a[i] + 0.5; +} + +var arr = [0.0,,2.5]; +assertEquals(0.5, f1(arr, 0)); +assertEquals(0.5, f1(arr, 0)); + +// Optimized code of f1 depends on initial object and array maps. +%OptimizeFunctionOnNextCall(f1, "parallel"); +assertEquals(0.5, f1(arr, 0)); +assertUnoptimized(f1); // Not yet optimized. +Object.prototype[1] = 1.5; // Invalidate current initial object map. +assertEquals(2, f1(arr, 1)); +%CompleteOptimization(f1); // Conclude optimization with... +assertUnoptimized(f1); // ... bailing out due to map dependency.