Index: tests/language/load_to_load_forwarding_test.dart |
diff --git a/tests/language/load_to_load_forwarding_test.dart b/tests/language/load_to_load_forwarding_test.dart |
index 6c7d8b426747625c0e6549c1cb877203edd9fd0d..cade3c6e9af31a75ac7e96ce7aa0cac166560e7d 100644 |
--- a/tests/language/load_to_load_forwarding_test.dart |
+++ b/tests/language/load_to_load_forwarding_test.dart |
@@ -35,10 +35,37 @@ bar(a, mode) { |
return [value1, value2]; |
} |
+// Verify that immutable and mutable VM fields (array length in this case) |
+// are not confused by load forwarding even if the access the same offset |
+// in the object. |
+testImmutableVMFields(arr, immutable) { |
+ if (immutable) { |
+ return arr.length; // Immutable length load. |
+ } |
+ |
+ if (arr.length < 2) { // Mutable length load, should not be forwarded. |
+ arr.add(null); |
+ } |
+ |
+ return arr.length; |
+} |
+ |
main() { |
+ final fixed = new List(10); |
+ final growable = []; |
+ testImmutableVMFields(fixed, true); |
+ testImmutableVMFields(growable, false); |
+ testImmutableVMFields(growable, false); |
+ |
for (var i = 0; i < 2000; i++) { |
Expect.listEquals([0x02010000, 0x03020100], foo(new A(0, 0))); |
Expect.listEquals([0x02010000, 0x03020100], bar(new A(0, 0), false)); |
Expect.listEquals([0x04020000, 0x03020100], bar(new A(0, 0), true)); |
+ testImmutableVMFields(fixed, true); |
} |
+ |
+ Expect.equals(1, testImmutableVMFields([], false)); |
+ Expect.equals(2, testImmutableVMFields([1], false)); |
+ Expect.equals(2, testImmutableVMFields([1, 2], false)); |
+ Expect.equals(3, testImmutableVMFields([1, 2, 3], false)); |
} |