aa4ee8d534
Currently, feedback vectors are allocated on a fixed budget of 1024. In some cases it might be beneficial to allocate feedback vectors based on invocation count rather than fixed budget. For example, if we have a large function that is only run once. This cl adds an option to use interrupt budget based on the bytecode size. It kind of mimics invocation count. We would allocate feedback vectors early when we have loops which is also required. This flag is turned off by default. In followup cl, we will enable it and if the memory / performance tradeoff is good we might make it default. Change-Id: I9f7231119b5fd65fb3268e665e2e315fb2625e1b Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2584960 Reviewed-by: Ross McIlroy <rmcilroy@chromium.org> Reviewed-by: Toon Verwaest <verwaest@chromium.org> Commit-Queue: Mythri Alle <mythria@chromium.org> Cr-Commit-Position: refs/heads/master@{#72371}
87 lines
2.9 KiB
JavaScript
87 lines
2.9 KiB
JavaScript
// Copyright 2018 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// Flags: --allow-natives-syntax --opt
|
|
|
|
function TestSetWithModifiedIterator(ctor) {
|
|
const k1 = {};
|
|
const k2 = {};
|
|
const entries = [k1, k2];
|
|
const arrayIteratorProto = Object.getPrototypeOf(entries[Symbol.iterator]());
|
|
const originalNext = arrayIteratorProto.next;
|
|
let callCount = 0;
|
|
arrayIteratorProto.next = function() {
|
|
callCount++;
|
|
return originalNext.call(this);
|
|
};
|
|
|
|
const set = new ctor(entries);
|
|
assertEquals(3, callCount); // +1 for iterator done
|
|
|
|
if('size' in set) assertEquals(2, set.size);
|
|
assertTrue(set.has(k1));
|
|
assertTrue(set.has(k2));
|
|
|
|
arrayIteratorProto.next = originalNext;
|
|
}
|
|
%PrepareFunctionForOptimization(TestSetWithModifiedIterator);
|
|
%EnsureFeedbackVectorForFunction(assertTrue);
|
|
%EnsureFeedbackVectorForFunction(assertEquals);
|
|
TestSetWithModifiedIterator(Set);
|
|
TestSetWithModifiedIterator(Set);
|
|
TestSetWithModifiedIterator(Set);
|
|
%OptimizeFunctionOnNextCall(TestSetWithModifiedIterator);
|
|
TestSetWithModifiedIterator(Set);
|
|
assertOptimized(TestSetWithModifiedIterator);
|
|
%DeoptimizeFunction(TestSetWithModifiedIterator);
|
|
|
|
%PrepareFunctionForOptimization(TestSetWithModifiedIterator);
|
|
TestSetWithModifiedIterator(WeakSet);
|
|
TestSetWithModifiedIterator(WeakSet);
|
|
TestSetWithModifiedIterator(WeakSet);
|
|
%OptimizeFunctionOnNextCall(TestSetWithModifiedIterator);
|
|
TestSetWithModifiedIterator(WeakSet);
|
|
assertOptimized(TestSetWithModifiedIterator);
|
|
%DeoptimizeFunction(TestSetWithModifiedIterator);
|
|
|
|
|
|
function TestMapWithModifiedIterator(ctor) {
|
|
const k1 = {};
|
|
const k2 = {};
|
|
const entries = [[k1, 1], [k2, 2]];
|
|
const arrayIteratorProto = Object.getPrototypeOf(entries[Symbol.iterator]());
|
|
const originalNext = arrayIteratorProto.next;
|
|
let callCount = 0;
|
|
arrayIteratorProto.next = function() {
|
|
callCount++;
|
|
return originalNext.call(this);
|
|
};
|
|
|
|
const set = new ctor(entries);
|
|
assertEquals(3, callCount); // +1 for iterator done
|
|
|
|
if('size' in set) assertEquals(2, set.size);
|
|
assertEquals(1, set.get(k1));
|
|
assertEquals(2, set.get(k2));
|
|
|
|
arrayIteratorProto.next = originalNext;
|
|
}
|
|
%PrepareFunctionForOptimization(TestMapWithModifiedIterator);
|
|
TestMapWithModifiedIterator(Map);
|
|
TestMapWithModifiedIterator(Map);
|
|
TestMapWithModifiedIterator(Map);
|
|
%OptimizeFunctionOnNextCall(TestMapWithModifiedIterator);
|
|
TestMapWithModifiedIterator(Map);
|
|
assertOptimized(TestMapWithModifiedIterator);
|
|
%DeoptimizeFunction(TestMapWithModifiedIterator);
|
|
|
|
%PrepareFunctionForOptimization(TestMapWithModifiedIterator);
|
|
TestMapWithModifiedIterator(WeakMap);
|
|
TestMapWithModifiedIterator(WeakMap);
|
|
TestMapWithModifiedIterator(WeakMap);
|
|
%OptimizeFunctionOnNextCall(TestMapWithModifiedIterator);
|
|
TestMapWithModifiedIterator(WeakMap);
|
|
assertOptimized(TestMapWithModifiedIterator);
|
|
%DeoptimizeFunction(TestMapWithModifiedIterator);
|