| // 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. |
| |
| // @dart = 2.9 |
| |
| // Test that the compiler's load elimination phase sees interfering writes to |
| // the array's buffer. |
| |
| import "dart:typed_data"; |
| import 'package:expect/expect.dart'; |
| |
| aliasWithByteData1() { |
| var aa = new Int8List(10); |
| var b = new ByteData.view(aa.buffer); |
| for (int i = 0; i < aa.length; i++) aa[i] = 9; |
| |
| var x1 = aa[3]; |
| b.setInt8(3, 1); |
| var x2 = aa[3]; |
| |
| Expect.equals(9, x1); |
| Expect.equals(1, x2); |
| } |
| |
| aliasWithByteData2() { |
| var b = new ByteData(10); |
| var aa = new Int8List.view(b.buffer); |
| for (int i = 0; i < aa.length; i++) aa[i] = 9; |
| |
| var x1 = aa[3]; |
| b.setInt8(3, 1); |
| var x2 = aa[3]; |
| |
| Expect.equals(9, x1); |
| Expect.equals(1, x2); |
| } |
| |
| alias8x8() { |
| var buffer = new Int8List(10).buffer; |
| var a1 = new Int8List.view(buffer); |
| var a2 = new Int8List.view(buffer, 1); |
| |
| for (int i = 0; i < a1.length; i++) a1[i] = 9; |
| |
| // Different indexes that alias. |
| var x1 = a1[1]; |
| a2[0] = 0; |
| var x2 = a1[1]; |
| Expect.equals(9, x1); |
| Expect.equals(0, x2); |
| |
| for (int i = 0; i < a1.length; i++) a1[i] = 9; |
| |
| // Same indexes that don't alias. |
| x1 = a1[1]; |
| a2[1] = 5; |
| x2 = a1[1]; |
| Expect.equals(9, x1); |
| Expect.equals(9, x2); |
| } |
| |
| alias8x16() { |
| var a1 = new Int8List(10); |
| var a2 = new Int16List.view(a1.buffer); |
| |
| for (int i = 0; i < a1.length; i++) a1[i] = 9; |
| |
| // Same indexes that alias. |
| var x1 = a1[0]; |
| a2[0] = 0x101; |
| var x2 = a1[0]; |
| Expect.equals(9, x1); |
| Expect.equals(1, x2); |
| |
| for (int i = 0; i < a1.length; i++) a1[i] = 9; |
| |
| // Different indexes that alias. |
| x1 = a1[4]; |
| a2[2] = 0x505; |
| x2 = a1[4]; |
| Expect.equals(9, x1); |
| Expect.equals(5, x2); |
| |
| for (int i = 0; i < a1.length; i++) a1[i] = 9; |
| |
| // Same indexes that don't alias. |
| x1 = a1[3]; |
| a2[3] = 0x505; |
| x2 = a1[3]; |
| Expect.equals(9, x1); |
| Expect.equals(9, x2); |
| |
| for (int i = 0; i < a1.length; i++) a1[i] = 9; |
| |
| // Different indexes don't alias. |
| x1 = a1[2]; |
| a2[0] = 0x505; |
| x2 = a1[2]; |
| Expect.equals(9, x1); |
| Expect.equals(9, x2); |
| } |
| |
| main() { |
| aliasWithByteData1(); |
| aliasWithByteData2(); |
| alias8x8(); |
| alias8x16(); |
| } |