Index: test/mjsunit/compiler/dead-loops-neg.js |
diff --git a/test/mjsunit/compiler/property-static.js b/test/mjsunit/compiler/dead-loops-neg.js |
similarity index 51% |
copy from test/mjsunit/compiler/property-static.js |
copy to test/mjsunit/compiler/dead-loops-neg.js |
index 07021340cd7aa94440638f925eeed921ee78c9c7..dbf500b48e773740068aa2318278b66f46ebdaeb 100644 |
--- a/test/mjsunit/compiler/property-static.js |
+++ b/test/mjsunit/compiler/dead-loops-neg.js |
@@ -27,43 +27,74 @@ |
// Flags: --allow-natives-syntax |
-// Test usage of static type information for loads that would otherwise |
-// turn into polymorphic or generic loads. |
+// Presents negative opportunities for dead loop removal. |
-// Prepare a highly polymorphic load to be used by all tests. |
-Object.prototype.load = function() { return this.property; }; |
-Object.prototype.load.call({ A:0, property:10 }); |
-Object.prototype.load.call({ A:0, B:0, property:11 }); |
-Object.prototype.load.call({ A:0, B:0, C:0, property:12 }); |
-Object.prototype.load.call({ A:0, B:0, C:0, D:0, property:13 }); |
-Object.prototype.load.call({ A:0, B:0, C:0, D:0, E:0, property:14 }); |
-Object.prototype.load.call({ A:0, B:0, C:0, D:0, E:0, F:0, property:15 }); |
+function loop1() { |
+ while (true) return; |
+} |
-// Test for object literals. |
-(function() { |
- function f(x) { |
- var object = { property:x }; |
- return object.load(); |
- } |
+function loop2() { |
+ var i = 0; |
+ while (i++ < 10) ; |
+ return i; // value of {i} escapes. |
+ // can only remove the loop with induction variable analysis. |
+} |
- assertSame(1, f(1)); |
- assertSame(2, f(2)); |
- %OptimizeFunctionOnNextCall(f); |
- assertSame(3, f(3)); |
-})(); |
+function loop3() { |
+ var i = 0; |
+ for (; i < 10; i++) ; |
+ return i; // value of {i} escapes. |
+ // can only remove the loop with induction variable analysis. |
+} |
-// Test for inlined constructors. |
-(function() { |
- function c(x) { |
- this.property = x; |
- } |
- function f(x) { |
- var object = new c(x); |
- return object.load(); |
+function loop4() { |
+ var a = 0; |
+ for (var i = 0; i < 10; i++) a++; |
+ return a; // value of {a} escapes. |
+ // can only remove the loop with induction variable analysis. |
+} |
+ |
+function loop5() { |
+ var a = new Int32Array(4), sum = 0; |
+ for (var i = 0; i < a.length; i++) { |
+ sum += a[i]; |
} |
+ return sum; // {sum} escapes. |
+ // can only remove the loop by figuring out that all elements of {a} are 0. |
+} |
+ |
+function loop6(a) { |
+ for (var i = 0; i < a; i++) ; // implicit a.valueOf(). |
+ // can only remove the loop by guarding on the type of a. |
+} |
+ |
+function loop7(a) { |
+ for (var i = 0; i < 10; i++) a.toString(); // unknown side-effect on a. |
+ // can only remove the loop by guarding on the type of a. |
+} |
+ |
+function loop8(a) { |
+ for (var i = 0; i < 10; i++) a.valueOf(); // unknown side-effect on a. |
+ // can only remove the loop by guarding on the type of a. |
+} |
+ |
+var no_params_loops = [loop1, loop2, loop3, loop4, loop5, loop6]; |
+var params_loops = [loop6, loop7, loop8]; |
+ |
+for (var i = 0; i < no_params_loops.length; i++) { |
+ var f = no_params_loops[i]; |
+ f(); |
+ f(); |
+ f(); |
+ %OptimizeFunctionOnNextCall(f); |
+ f(); |
+} |
- assertSame(1, f(1)); |
- assertSame(2, f(2)); |
+for (var i = 0; i < params_loops.length; i++) { |
+ var f = params_loops[i]; |
+ f(3); |
+ f(7); |
+ f(11); |
%OptimizeFunctionOnNextCall(f); |
- assertSame(3, f(3)); |
-})(); |
+ f(9); |
+} |