Reviewers: Michael Starzinger,
Message:
PTAL
Description:
Reland r12342: Flush monomorphic ICs on context disposal instead of context
exit.
[email protected]
Please review this at https://chromiumcodereview.appspot.com/11092081/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files:
M src/heap.h
src/heap.cc
M src/objects-visiting-inl.h
M test/cctest/test-api.cc
test/cctest/test-heap.cc
test/mjsunit/debug-script.js
M test/mjsunit/elements-transition-hoisting.js
Index: src/heap.cc
diff --git a/src/heap.cc b/src/heap.cc
index
d5d1128e49affbfb251df6c441f1dbc41e01eb70..eacd5e86d7cc4822c05e6cc83537533ec33b1194
100644
--- a/src/heap.cc
+++ b/src/heap.cc
@@ -98,6 +98,7 @@ Heap::Heap()
linear_allocation_scope_depth_(0),
contexts_disposed_(0),
global_ic_age_(0),
+ flush_monomorphic_ics_(false),
scan_on_scavenge_pages_(0),
new_space_(this),
old_pointer_space_(NULL),
@@ -988,7 +989,7 @@ void Heap::MarkCompact(GCTracer* tracer) {
contexts_disposed_ = 0;
- isolate_->set_context_exit_happened(false);
+ flush_monomorphic_ics_ = false;
}
Index: src/heap.h
diff --git a/src/heap.h b/src/heap.h
index
d6a3d2951a2d4a446b7510f87a5a50f838631b72..e48405460e903d79e4630fd1d1074b1cf26ef820
100644
--- a/src/heap.h
+++ b/src/heap.h
@@ -1103,7 +1103,10 @@ class Heap {
void EnsureHeapIsIterable();
// Notify the heap that a context has been disposed.
- int NotifyContextDisposed() { return ++contexts_disposed_; }
+ int NotifyContextDisposed() {
+ flush_monomorphic_ics_ = true;
+ return ++contexts_disposed_;
+ }
// Utility to invoke the scavenger. This is needed in test code to
// ensure correct callback for weak global handles.
@@ -1620,6 +1623,8 @@ class Heap {
global_ic_age_ = (global_ic_age_ + 1) &
SharedFunctionInfo::ICAgeBits::kMax;
}
+ bool flush_monomorphic_ics() { return flush_monomorphic_ics_; }
+
intptr_t amount_of_external_allocated_memory() {
return amount_of_external_allocated_memory_;
}
@@ -1705,6 +1710,8 @@ class Heap {
int global_ic_age_;
+ bool flush_monomorphic_ics_;
+
int scan_on_scavenge_pages_;
#if defined(V8_TARGET_ARCH_X64)
Index: src/objects-visiting-inl.h
diff --git a/src/objects-visiting-inl.h b/src/objects-visiting-inl.h
index
3d4f1daba40f9eea5df0695b4f4bdcf1fc8c0d6d..6655be680e883c5d7eb8404be32f39c13bb7d5e2
100644
--- a/src/objects-visiting-inl.h
+++ b/src/objects-visiting-inl.h
@@ -214,9 +214,8 @@ void
StaticMarkingVisitor<StaticVisitor>::VisitCodeTarget(
// when they might be keeping a Context alive, or when the heap is about
// to be serialized.
if (FLAG_cleanup_code_caches_at_gc && target->is_inline_cache_stub()
- && (target->ic_state() == MEGAMORPHIC || Serializer::enabled() ||
- heap->isolate()->context_exit_happened() ||
- target->ic_age() != heap->global_ic_age())) {
+ && (target->ic_state() == MEGAMORPHIC ||
heap->flush_monomorphic_ics() ||
+ Serializer::enabled() || target->ic_age() !=
heap->global_ic_age())) {
IC::Clear(rinfo->pc());
target = Code::GetCodeFromTargetAddress(rinfo->target_address());
}
Index: test/cctest/test-api.cc
diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
index
067d134b18650b44a56b5ddcd2338477da7ea802..09a08c415e9cac4a18e8966ede6e9082d70f1eb9
100644
--- a/test/cctest/test-api.cc
+++ b/test/cctest/test-api.cc
@@ -1,4 +1,5 @@
// Copyright 2012 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:
@@ -10840,18 +10841,24 @@ TEST(DontLeakGlobalObjects) {
{ v8::HandleScope scope;
LocalContext context;
}
+ // Fire context disposed notification to force clearing monomorphic
ICs.
+ v8::V8::ContextDisposedNotification();
CheckSurvivingGlobalObjectsCount(0);
{ v8::HandleScope scope;
LocalContext context;
v8_compile("Date")->Run();
}
+ // Fire context disposed notification to force clearing monomorphic
ICs.
+ v8::V8::ContextDisposedNotification();
CheckSurvivingGlobalObjectsCount(0);
{ v8::HandleScope scope;
LocalContext context;
v8_compile("/aaa/")->Run();
}
+ // Fire context disposed notification to force clearing monomorphic
ICs.
+ v8::V8::ContextDisposedNotification();
CheckSurvivingGlobalObjectsCount(0);
{ v8::HandleScope scope;
@@ -10860,6 +10867,8 @@ TEST(DontLeakGlobalObjects) {
LocalContext context(&extensions);
v8_compile("gc();")->Run();
}
+ // Fire context disposed notification to force clearing monomorphic
ICs.
+ v8::V8::ContextDisposedNotification();
CheckSurvivingGlobalObjectsCount(0);
}
}
@@ -15006,6 +15015,7 @@ TEST(Regress528) {
context->Exit();
}
context.Dispose();
+ v8::V8::ContextDisposedNotification();
for (gc_count = 1; gc_count < 10; gc_count++) {
other_context->Enter();
CompileRun(source_exception);
Index: test/cctest/test-heap.cc
diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc
index
d6285db026bba0d530576b0216ec44f506274f7c..4ae5b6eb2c9b9d1fa1062510c026d95d3230a766
100644
--- a/test/cctest/test-heap.cc
+++ b/test/cctest/test-heap.cc
@@ -1067,6 +1067,7 @@ TEST(TestInternalWeakLists) {
}
// Mark compact handles the weak references.
+ ISOLATE->compilation_cache()->Clear();
HEAP->CollectAllGarbage(Heap::kNoGCFlags);
CHECK_EQ(opt ? 4 : 0, CountOptimizedUserFunctions(ctx[i]));
@@ -1398,6 +1399,7 @@ TEST(LeakNativeContextViaMap) {
ctx2->Exit();
ctx1->Exit();
ctx1.Dispose();
+ v8::V8::ContextDisposedNotification();
}
HEAP->CollectAllAvailableGarbage();
CHECK_EQ(2, NumberOfGlobalObjects());
@@ -1435,6 +1437,7 @@ TEST(LeakNativeContextViaFunction) {
ctx2->Exit();
ctx1->Exit();
ctx1.Dispose();
+ v8::V8::ContextDisposedNotification();
}
HEAP->CollectAllAvailableGarbage();
CHECK_EQ(2, NumberOfGlobalObjects());
@@ -1470,6 +1473,7 @@ TEST(LeakNativeContextViaMapKeyed) {
ctx2->Exit();
ctx1->Exit();
ctx1.Dispose();
+ v8::V8::ContextDisposedNotification();
}
HEAP->CollectAllAvailableGarbage();
CHECK_EQ(2, NumberOfGlobalObjects());
@@ -1509,6 +1513,7 @@ TEST(LeakNativeContextViaMapProto) {
ctx2->Exit();
ctx1->Exit();
ctx1.Dispose();
+ v8::V8::ContextDisposedNotification();
}
HEAP->CollectAllAvailableGarbage();
CHECK_EQ(2, NumberOfGlobalObjects());
@@ -2108,8 +2113,6 @@ TEST(IncrementalMarkingPreservesMonomorhpicIC) {
Code* ic_before = FindFirstIC(f->shared()->code(), Code::LOAD_IC);
CHECK(ic_before->ic_state() == MONOMORPHIC);
- // Fire context dispose notification.
- v8::V8::ContextDisposedNotification();
SimulateIncrementalMarking();
HEAP->CollectAllGarbage(Heap::kNoGCFlags);
Index: test/mjsunit/debug-script.js
diff --git a/test/mjsunit/debug-script.js b/test/mjsunit/debug-script.js
index
d7ffb569580638a766cacf6a0848f5afbbba2a7d..082a08f5ac95ec2b9947ef49864b99767379b3ad
100644
--- a/test/mjsunit/debug-script.js
+++ b/test/mjsunit/debug-script.js
@@ -25,9 +25,10 @@
// (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: --expose-debug-as debug --expose-gc --noparallel-recompilation
+// Flags: --expose-debug-as debug --expose-gc --noparallel-recompilation
+// Flags: --send-idle-notification
// Get the Debug object exposed from the debug context global object.
-Debug = debug.Debug
+Debug = debug.Debug;
Date();
RegExp();
Index: test/mjsunit/elements-transition-hoisting.js
diff --git a/test/mjsunit/elements-transition-hoisting.js
b/test/mjsunit/elements-transition-hoisting.js
index
b3de85f0be841c2e15a93cdbd544bbd83348edf2..017e7ec51f0afd370a1068dbba31d70924dd94d0
100644
--- a/test/mjsunit/elements-transition-hoisting.js
+++ b/test/mjsunit/elements-transition-hoisting.js
@@ -25,8 +25,7 @@
// (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 --smi-only-arrays --expose-gc
-// Flags: --noparallel-recompilation
+// Flags: --allow-natives-syntax --smi-only-arrays
--noparallel-recompilation
// Ensure that ElementsKind transitions in various situations are hoisted
(or
// not hoisted) correctly, don't change the semantics programs and don't
trigger
@@ -40,11 +39,6 @@ if (support_smi_only_arrays) {
print("Tests do NOT include smi-only arrays.");
}
-// Force existing ICs from previous stress runs to be flushed, otherwise
the
-// assumptions in this test about when deoptimizations get triggered are
not
-// valid.
-gc();
-
if (support_smi_only_arrays) {
// Make sure that a simple elements array transitions inside a loop
before
// stores to an array gets hoisted in a way that doesn't generate a
deopt in
@@ -66,6 +60,7 @@ if (support_smi_only_arrays) {
testDoubleConversion4(new Array(5));
testDoubleConversion4(new Array(5));
assertTrue(2 != %GetOptimizationStatus(testDoubleConversion4));
+ %ClearFunctionTypeFeedback(testDoubleConversion4);
// Make sure that non-element related map checks that are not preceded by
// transitions in a loop still get hoisted in a way that doesn't
generate a
@@ -91,6 +86,7 @@ if (support_smi_only_arrays) {
testExactMapHoisting(new Array(5));
testExactMapHoisting(new Array(5));
assertTrue(2 != %GetOptimizationStatus(testExactMapHoisting));
+ %ClearFunctionTypeFeedback(testExactMapHoisting);
// Make sure that non-element related map checks do NOT get hoisted if
they
// depend on an elements transition before them and it's not possible to
hoist
@@ -122,6 +118,7 @@ if (support_smi_only_arrays) {
testExactMapHoisting2(new Array(5));
// Temporarily disabled - see bug 2176.
// assertTrue(2 != %GetOptimizationStatus(testExactMapHoisting2));
+ %ClearFunctionTypeFeedback(testExactMapHoisting2);
// Make sure that non-element related map checks do get hoisted if they
use
// the transitioned map for the check and all transitions that they
depend
@@ -150,6 +147,7 @@ if (support_smi_only_arrays) {
testExactMapHoisting3(new Array(5));
testExactMapHoisting3(new Array(5));
assertTrue(2 != %GetOptimizationStatus(testExactMapHoisting3));
+ %ClearFunctionTypeFeedback(testExactMapHoisting3);
function testDominatingTransitionHoisting1(a) {
var object = new Object();
@@ -176,6 +174,7 @@ if (support_smi_only_arrays) {
// above the access, causing a deopt. We should update the type of access
// rather than forbid hoisting the transition.
assertTrue(2 != %GetOptimizationStatus(testDominatingTransitionHoisting1));
+ %ClearFunctionTypeFeedback(testDominatingTransitionHoisting1);
*/
function testHoistingWithSideEffect(a) {
@@ -196,6 +195,7 @@ if (support_smi_only_arrays) {
testHoistingWithSideEffect(new Array(5));
testHoistingWithSideEffect(new Array(5));
assertTrue(2 != %GetOptimizationStatus(testHoistingWithSideEffect));
+ %ClearFunctionTypeFeedback(testHoistingWithSideEffect);
function testStraightLineDupeElinination(a,b,c,d,e,f) {
var count = 3;
@@ -234,4 +234,5 @@ if (support_smi_only_arrays) {
testStraightLineDupeElinination(new Array(5),0,0,0,0,0);
testStraightLineDupeElinination(new Array(5),0,0,0,0,0);
assertTrue(2 != %GetOptimizationStatus(testStraightLineDupeElinination));
+ %ClearFunctionTypeFeedback(testStraightLineDupeElinination);
}
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev