Index: test/mjsunit/array-constructor-feedback.js |
diff --git a/test/mjsunit/array-constructor-feedback.js b/test/mjsunit/array-constructor-feedback.js |
index 72ff12c08f0f04c28a7bffa1f3311c173a2d24fd..bfe50d250ce6ada1351615c6165c506af075b068 100644 |
--- a/test/mjsunit/array-constructor-feedback.js |
+++ b/test/mjsunit/array-constructor-feedback.js |
@@ -138,8 +138,8 @@ if (support_smi_only_arrays) { |
})(); |
- // Test: Ensure that bailouts from the stub don't deopt a crankshafted |
- // method with a call to that stub. |
+ // Test: Ensure that inlined array calls in crankshaft learn from deopts |
+ // based on the move to a dictionary for the array. |
(function() { |
function bar(len) { |
return new Array(len); |
@@ -152,10 +152,16 @@ if (support_smi_only_arrays) { |
a = bar(10); |
assertKind(elements_kind.fast, a); |
assertOptimized(bar); |
- // The stub bails out, but the method call should be fine. |
+ // bar should deopt because the length is too large. |
+ a = bar(100000); |
+ assertUnoptimized(bar); |
+ assertKind(elements_kind.dictionary, a); |
+ // The allocation site now has feedback that means the array constructor |
+ // will not be inlined. |
+ %OptimizeFunctionOnNextCall(bar); |
a = bar(100000); |
- assertOptimized(bar); |
assertKind(elements_kind.dictionary, a); |
+ assertOptimized(bar); |
// If the argument isn't a smi, it bails out as well |
a = bar("oops"); |
@@ -172,8 +178,12 @@ if (support_smi_only_arrays) { |
barn(1, 2, 3); |
assertOptimized(barn); |
a = barn(1, "oops", 3); |
- // The stub should bail out but the method should remain optimized. |
+ // The method should deopt, but learn from the failure to avoid inlining |
+ // the array. |
assertKind(elements_kind.fast, a); |
+ assertUnoptimized(barn); |
+ %OptimizeFunctionOnNextCall(barn); |
+ a = barn(1, "oops", 3); |
assertOptimized(barn); |
})(); |
@@ -219,4 +229,29 @@ if (support_smi_only_arrays) { |
assertFalse(Realm.eval(contextB, "bar2();") instanceof Array); |
assertTrue(Realm.eval(contextB, "bar2() instanceof Array")); |
})(); |
+ |
+ // Test: create array with packed feedback, then optimize/inline |
+ // function. Verify that if we ask for a holey array then we deopt. |
+ // Reoptimization will proceed with the correct feedback and we |
+ // won't deopt anymore. |
+ (function() { |
+ function bar(len) { return new Array(len); } |
+ bar(0); |
+ bar(0); |
+ %OptimizeFunctionOnNextCall(bar); |
+ a = bar(0); |
+ assertOptimized(bar); |
+ assertFalse(isHoley(a)); |
+ a = bar(1); // ouch! |
+ assertUnoptimized(bar); |
+ assertTrue(isHoley(a)); |
+ // Try again |
+ %OptimizeFunctionOnNextCall(bar); |
+ a = bar(100); |
+ assertOptimized(bar); |
+ assertTrue(isHoley(a)); |
+ a = bar(0); |
+ assertOptimized(bar); |
+ assertTrue(isHoley(a)); |
+ })(); |
} |