Index: test/mjsunit/compiler/load-elimination-global.js |
diff --git a/test/mjsunit/compiler/load-elimination.js b/test/mjsunit/compiler/load-elimination-global.js |
similarity index 62% |
copy from test/mjsunit/compiler/load-elimination.js |
copy to test/mjsunit/compiler/load-elimination-global.js |
index e019508c65ebdc9eb08e03979f81b70633f55319..9caaa9f71874b9c8b8f48b3d60bb4bcf2c1bbf75 100644 |
--- a/test/mjsunit/compiler/load-elimination.js |
+++ b/test/mjsunit/compiler/load-elimination-global.js |
@@ -27,7 +27,12 @@ |
// Flags: --allow-natives-syntax --load-elimination |
-// Test local load elimination of redundant loads and stores. |
+// Test global load elimination of redundant loads and stores. |
+ |
+var X = true; // For forcing branches. |
+X = false; |
+X = true; |
+X = false; |
function B(x, y) { |
this.x = x; |
@@ -37,33 +42,92 @@ function B(x, y) { |
function test_load() { |
var a = new B(1, 2); |
- return a.x + a.x + a.x + a.x; |
+ var f = a.x + a.x; |
+ if (false) ; |
+ return f + a.x + a.x; |
+} |
+ |
+function test_load2() { |
+ var a = new B(1, 2); |
+ var f = a.x + a.x; |
+ if (true) ; |
+ return f + a.x + a.x; |
} |
function test_store_load() { |
var a = new B(1, 2); |
a.x = 4; |
- var f = a.x; |
- a.x = 5; |
- var g = a.x; |
- a.x = 6; |
- var h = a.x; |
- a.x = 7; |
- return f + g + h + a.x; |
+ var b = X ? a.x : a.x; |
+ return b + a.x; |
+} |
+ |
+function test_store_load2() { |
+ var a = new B(1, 2); |
+ var c = 6; |
+ if (X) a.x = c; |
+ else a.x = c; |
+ return a.x + a.x; |
} |
function test_nonaliasing_store1() { |
var a = new B(2, 3), b = new B(3, 4); |
+ if (X) ; |
b.x = 4; |
+ if (X) ; |
var f = a.x; |
+ if (X) ; |
b.x = 5; |
+ if (X) ; |
var g = a.x; |
+ if (X) ; |
b.x = 6; |
+ if (X) ; |
var h = a.x; |
+ if (X) ; |
b.x = 7; |
+ if (X) ; |
return f + g + h + a.x; |
} |
+function test_loop(x) { |
+ var a = new B(2, 3); |
+ var v = a.x; |
+ var total = v; |
+ var i = 0; |
+ while (i++ < 10) { |
+ total = a.x; |
+ a.y = 4; |
+ } |
+ return total; |
+} |
+ |
+function test_loop2(x) { |
+ var a = new B(2, 3); |
+ var v = a.x; |
+ var total = v; |
+ var i = 0; |
+ while (i++ < 10) { |
+ total = a.x; // a.x not affected by loop |
+ a.y = 4; |
+ |
+ var j = 0; |
+ while (j++ < 10) { |
+ total = a.x; // a.x not affected by loop |
+ a.y = 5; |
+ } |
+ |
+ total = a.x; |
+ a.y = 6; |
+ |
+ j = 0; |
+ while (j++ < 10) { |
+ total = a.x; // a.x not affected by loop |
+ a.y = 7; |
+ } |
+ } |
+ return total; |
+} |
+ |
function killall() { |
try { } catch(e) { } |
} |
@@ -72,35 +136,61 @@ function killall() { |
function test_store_load_kill() { |
var a = new B(1, 2); |
+ if (X) ; |
a.x = 4; |
+ if (X) ; |
var f = a.x; |
+ if (X) ; |
a.x = 5; |
+ if (X) ; |
var g = a.x; |
+ if (X) ; |
killall(); |
+ if (X) ; |
a.x = 6; |
+ if (X) ; |
var h = a.x; |
+ if (X) ; |
a.x = 7; |
+ if (X) ; |
return f + g + h + a.x; |
} |
function test_store_store() { |
var a = new B(6, 7); |
+ if (X) ; |
a.x = 7; |
+ if (X) ; |
a.x = 7; |
+ if (X) ; |
a.x = 7; |
+ if (X) ; |
a.x = 7; |
+ if (X) ; |
return a.x; |
} |
function test(x, f) { |
+ X = true; |
+ assertEquals(x, f()); |
+ assertEquals(x, f()); |
+ X = false; |
assertEquals(x, f()); |
assertEquals(x, f()); |
+ X = true; |
%OptimizeFunctionOnNextCall(f); |
assertEquals(x, f()); |
+ assertEquals(x, f()); |
+ X = false; |
+ assertEquals(x, f()); |
+ assertEquals(x, f()); |
} |
test(4, test_load); |
-test(22, test_store_load); |
+test(8, test_store_load); |
+test(12, test_store_load2); |
test(8, test_nonaliasing_store1); |
test(22, test_store_load_kill); |
test(7, test_store_store); |
+test(2, test_loop); |
+test(2, test_loop2); |