Commit 932dc50f authored by Sigurd Schneider's avatar Sigurd Schneider Committed by Commit Bot

[turbofan] Enable Array.p.reduce[Right] for holey arrays

Change-Id: If1a3d08c1fca73234d94db6b527f5d11d10aa6cc
Reviewed-on: https://chromium-review.googlesource.com/867032
Commit-Queue: Sigurd Schneider <sigurds@chromium.org>
Reviewed-by: 's avatarMichael Stanton <mvstanton@chromium.org>
Cr-Commit-Position: refs/heads/master@{#50722}
parent 517221da
This diff is collapsed.
......@@ -52,6 +52,7 @@ class JSCallReducer final : public AdvancedReducer {
void Finalize() final;
private:
enum ArrayReduceDirection { kArrayReduceLeft, kArrayReduceRight };
Reduction ReduceArrayConstructor(Node* node);
Reduction ReduceBooleanConstructor(Node* node);
Reduction ReduceCallApiFunction(Node* node, Handle<JSFunction> function);
......@@ -72,8 +73,8 @@ class JSCallReducer final : public AdvancedReducer {
Reduction ReduceReflectGetPrototypeOf(Node* node);
Reduction ReduceReflectHas(Node* node);
Reduction ReduceArrayForEach(Handle<JSFunction> function, Node* node);
Reduction ReduceArrayReduce(Handle<JSFunction> function, Node* node);
Reduction ReduceArrayReduceRight(Handle<JSFunction> function, Node* node);
Reduction ReduceArrayReduce(Handle<JSFunction> function, Node* node,
ArrayReduceDirection direction);
Reduction ReduceArrayMap(Handle<JSFunction> function, Node* node);
Reduction ReduceArrayFilter(Handle<JSFunction> function, Node* node);
enum class ArrayFindVariant : uint8_t { kFind, kFindIndex };
......
......@@ -641,6 +641,56 @@ assertEquals(undefined, arr.reduceRight(function(val) { return val }));
assertEquals(total, g());
})();
(function OptimizedReduceEagerDeoptMiddleOfIterationHoley() {
let deopt = false;
let array = [, ,11,22,,33,45,56,,6,77,84,93,101,];
let f = (a,current) => {
print(a);
if (current == 6 && deopt) {array[0] = 1.5; }
return a + current;
};
let g = function() {
return array.reduce(f);
}
g(); g();
let total = g();
%OptimizeFunctionOnNextCall(g);
g();
deopt = true;
g();
deopt = false;
array = [11,22,33,45,56,6,77,84,93,101];
%OptimizeFunctionOnNextCall(g);
g();
deopt = true;
assertEquals(total, g());
})();
(function OptimizedReduceRightEagerDeoptMiddleOfIterationHoley() {
let deopt = false;
let array = [, ,11,22,,33,45,56,,6,77,84,93,101,];
let f = (a,current) => {
print(a);
if (current == 6 && deopt) {array[array.length-1] = 1.5; }
return a + current;
};
let g = function() {
return array.reduceRight(f);
}
g(); g();
let total = g();
%OptimizeFunctionOnNextCall(g);
g();
deopt = true;
g();
deopt = false;
array = [11,22,33,45,56,6,77,84,93,101];
%OptimizeFunctionOnNextCall(g);
g();
deopt = true;
assertEquals(total, g());
})();
(function ReduceCatch() {
let f = (a,current) => {
return a + current;
......
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