Index: test/mjsunit/regress-330046.js |
diff --git a/test/mjsunit/regress/regress-int32-truncation.js b/test/mjsunit/regress-330046.js |
similarity index 69% |
copy from test/mjsunit/regress/regress-int32-truncation.js |
copy to test/mjsunit/regress-330046.js |
index dec4ac1195a6c4928d84eac8cc8dc9496bf66600..d94b804ac0a974d94de784b02b7a2b1f6c8a6f25 100644 |
--- a/test/mjsunit/regress/regress-int32-truncation.js |
+++ b/test/mjsunit/regress-330046.js |
@@ -25,37 +25,37 @@ |
// (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: --use-osr --allow-natives-syntax --crankshaft |
-function f(i, b) { |
- var a = 0; |
- if (b) { |
- var c = 1 << i; |
- a = c + c; |
+var o1 = {a : 10}; |
+var o2 = { }; |
+o2.__proto__ = o1; |
+var o3 = { }; |
+o3.__proto__ = o2; |
+ |
+function f(n, x, b) { |
+ var sum = x.a; |
+ for (var i = 0; i < n; i++) { |
+ sum = 1.0 / i; |
} |
- var x = a >> 3; |
- return a; |
+ return sum; |
} |
-f(1, false); |
-f(1, true); |
-%OptimizeFunctionOnNextCall(f); |
-assertEquals((1 << 30) * 2, f(30, true)); |
- |
+f(10, o3); |
+f(20, o3); |
+f(30, o3); |
+%OptimizeFunctionOnNextCall(f, "concurrent"); |
+f(100000, o3); |
+// At this point OSR replaces already optimized code. |
+// Check that it evicts old code from cache. |
-var global = 1; |
+// This causes all code for f to be lazily deopted. |
+o2.a = 5; |
-function f2(b) { |
- var a = 0; |
- if (b) { |
- a = global; |
- } |
- var x = a >> 3; |
- return a; |
-} |
+// If OSR did not evict the old code, it will be installed in f here. |
+%OptimizeFunctionOnNextCall(f); |
+f(10, o3); |
-f2(false); |
-f2(true); |
-%OptimizeFunctionOnNextCall(f2); |
-global = 2.5; |
-assertEquals(global, f2(true)); |
+// The old code is already deoptimized, but f still points to it. |
+// Disassembling it will crash. |
+%DebugDisassembleFunction(f); |