Index: tests/language/vm/store_elimination_vm_test.dart |
=================================================================== |
--- tests/language/vm/store_elimination_vm_test.dart (revision 0) |
+++ tests/language/vm/store_elimination_vm_test.dart (revision 0) |
@@ -0,0 +1,122 @@ |
+// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+// Test correctness of side effects tracking used by load to load forwarding. |
+ |
+// VMOptions=--optimization-counter-threshold=10 |
+ |
+import "package:expect/expect.dart"; |
+ |
+class C { |
+ var x; |
+ var y; |
+ final z = 123; |
+} |
+ |
+class D { |
+ var x = 0.0; |
+} |
+ |
+var array = [0, 0]; |
+ |
+s1(a) { |
+ a.x = 42; |
+ a.x = 43; |
+ return a.x; |
+} |
+ |
+void foo(a) { |
+ Expect.equals(42, a.x); |
+} |
+ |
+s1a(a) { |
+ a.x = 42; |
+ foo(a); |
+ a.x = 43; |
+ return a.x; |
+} |
+ |
+s2() { |
+ var t = new C(); |
+ return t; |
+} |
+ |
+s3(a, b) { |
+ a.x = b + 1; |
+ if (b % 2 == 0) { |
+ a.x = 0; |
+ } else { |
+ a.x = 0; |
+ } |
+ return a.x; |
+} |
+ |
+s4(a, b) { |
+ a.x = b + 1.0; |
+ if (b % 2 == 0) { |
+ a.x = b + 2.0; |
+ } |
+ a.x = b + 1.0; |
+ return a.x; |
+} |
+ |
+test_with_context() { |
+ f(a) { |
+ var b = a + 1; |
+ return (() => b + 1)(); |
+ } |
+ for (var i = 0; i < 100000; i++) f(42); |
+ Expect.equals(44, f(42)); |
+} |
+ |
+test_with_instance() { |
+ for (var i = 0; i < 20; i++) Expect.equals(43, s1(new C())); |
+ for (var i = 0; i < 20; i++) Expect.equals(43, s1a(new C())); |
+ for (var i = 0; i < 20; i++) Expect.equals(123, s2().z); |
+ for (var i = 0; i < 20; i++) Expect.equals(0, s3(new C(), i)); |
+ for (var i = 0; i < 20; i++) Expect.equals(i + 1.0, s4(new D(), i)); |
+} |
+ |
+arr1(a) { |
+ a[0] = 42; |
+ a[0] = 43; |
+ Expect.equals(a[0], 43); |
+ return a[0]; |
+} |
+ |
+arr2(a, b) { |
+ a[0] = 42; |
+ a[b % 2] = 43; |
+ Expect.equals(a[b % 2], 43); |
+ return a[0]; |
+} |
+ |
+test_with_array() { |
+ for (var i = 0; i < 20; i++) Expect.equals(43, arr1(array)); |
+ for (var i = 0; i < 20; i++) { |
+ Expect.equals(i % 2 == 0 ? 43 : 42, arr2(array, i)); |
+ } |
+} |
+ |
+var st = 0; |
+ |
+static1(b) { |
+ st = 42; |
+ if (b % 2 == 0) { |
+ st = 2; |
+ } |
+ st = b + 1; |
+ Expect.equals(st, b + 1); |
+ return st; |
+} |
+ |
+test_with_static() { |
+ for (var i = 0; i < 20; i++) Expect.equals(i + 1, static1(i)); |
+} |
+ |
+main() { |
+ test_with_instance(); |
+ test_with_array(); |
+ test_with_context(); |
+ test_with_static(); |
+} |