blob: 996b481aa19ac8caf03ca5aa063cc1ea1d2edd8c [file] [log] [blame]
// 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.
// @dart = 2.9
// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
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();
}