| Index: tests/language/vm/load_elimination_mark_stored_values_escaping_test.dart
|
| ===================================================================
|
| --- tests/language/vm/load_elimination_mark_stored_values_escaping_test.dart (revision 0)
|
| +++ tests/language/vm/load_elimination_mark_stored_values_escaping_test.dart (working copy)
|
| @@ -0,0 +1,64 @@
|
| +// Copyright (c) 2014, 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=--no-use-osr --optimization-counter-threshold=10 --enable-inlining-annotations
|
| +
|
| +// Tests correct handling of redefinitions in aliasing computation.
|
| +
|
| +import "package:expect/expect.dart";
|
| +
|
| +const alwaysInline = "AlwaysInline";
|
| +const noInline = "NeverInline";
|
| +
|
| +B G;
|
| +
|
| +class A {
|
| + int val = -1;
|
| +
|
| + @alwaysInline
|
| + poly(p) {
|
| + p.aa = this;
|
| + }
|
| +}
|
| +
|
| +
|
| +@noInline
|
| +modify() {
|
| + G.aa.val = 123;
|
| +}
|
| +
|
| +class B {
|
| + A aa;
|
| +
|
| + @alwaysInline
|
| + poly(p) {
|
| + G = this;
|
| + foo2(p, this);
|
| + modify();
|
| + }
|
| +}
|
| +
|
| +@alwaysInline
|
| +foo(obj, p) => obj.poly(p);
|
| +
|
| +@alwaysInline
|
| +foo2(obj, p) => obj.poly(p);
|
| +
|
| +@noInline
|
| +testfunc() {
|
| + var a = new A();
|
| + var b = new B();
|
| + foo(b, a);
|
| + return a.val;
|
| +}
|
| +
|
| +main() {
|
| + foo(new B(), new A());
|
| + foo(new A(), new B());
|
| + foo2(new B(), new A());
|
| + foo2(new A(), new B());
|
| + for (var i = 0; i < 100; i++) testfunc();
|
| + Expect.equals(123, testfunc());
|
| +}
|
|
|