Index: test/mjsunit/regress/regress-crbug-594183.js |
diff --git a/test/mjsunit/regress/regress-crbug-594183.js b/test/mjsunit/regress/regress-crbug-594183.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c87e32545828e470dd851801f53a8e6d7b44f65f |
--- /dev/null |
+++ b/test/mjsunit/regress/regress-crbug-594183.js |
@@ -0,0 +1,82 @@ |
+// Copyright 2016 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 |
+ |
+var global = {} |
+ |
+var fish = [ |
+ {'name': 'foo'}, |
+ {'name': 'bar'}, |
+]; |
+ |
+for (var i = 0; i < fish.length; i++) { |
+ global[fish[i].name] = 1; |
+} |
+ |
+function load() { |
+ var sum = 0; |
+ for (var i = 0; i < fish.length; i++) { |
+ var name = fish[i].name; |
+ sum += global[name]; |
+ } |
+ return sum; |
+} |
+ |
+load(); |
+load(); |
+%OptimizeFunctionOnNextCall(load); |
+load(); |
+assertOptimized(load); |
+ |
+function store() { |
+ for (var i = 0; i < fish.length; i++) { |
+ var name = fish[i].name; |
+ global[name] = 1; |
+ } |
+} |
+ |
+store(); |
+store(); |
+%OptimizeFunctionOnNextCall(store); |
+store(); |
+assertOptimized(store); |
+ |
+// Regression test for KeyedStoreIC bug: would use PROPERTY mode erroneously. |
+ |
+function store_element(obj, key) { |
+ obj[key] = 0; |
+} |
+ |
+var o1 = new Array(3); |
+var o2 = new Array(3); |
+o2.o2 = "o2"; |
+var o3 = new Array(3); |
+o3.o3 = "o3"; |
+var o4 = new Array(3); |
+o4.o4 = "o4"; |
+var o5 = new Array(3); |
+o5.o5 = "o5"; |
+// Make the KeyedStoreIC megamorphic. |
+store_element(o1, 0); // Premonomorphic |
+store_element(o1, 0); // Monomorphic |
+store_element(o2, 0); // 2-way polymorphic. |
+store_element(o3, 0); // 3-way polymorphic. |
+store_element(o4, 0); // 4-way polymorphic. |
+store_element(o5, 0); // Megamorphic. |
+ |
+function inferrable_store(key) { |
+ store_element(o5, key); |
+} |
+ |
+inferrable_store(0); |
+inferrable_store(0); |
+%OptimizeFunctionOnNextCall(inferrable_store); |
+inferrable_store(0); |
+assertOptimized(inferrable_store); |
+// If |inferrable_store| emitted a generic keyed store, it won't deopt upon |
+// seeing a property name key. It should have inferred a receiver map and |
+// emitted an elements store, however. |
+inferrable_store("deopt"); |
+assertUnoptimized(inferrable_store); |