OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 // Test that branch fusion correctly sets branch environment for comparisons | 5 // Test that branch fusion correctly sets branch environment for comparisons |
6 // that require unboxing and does not fuse branches that can deoptimize. | 6 // that require unboxing and does not fuse branches that can deoptimize. |
7 // VMOptions=--optimization-counter-threshold=10 --no-use-osr | 7 // VMOptions=--optimization-counter-threshold=10 --no-use-osr |
8 | 8 |
9 import "package:expect/expect.dart"; | 9 import "package:expect/expect.dart"; |
10 | 10 |
11 var sideEffect = true; | 11 var sideEffect = true; |
12 | 12 |
13 barDouble(a, b) { | 13 barDouble(a, b) { |
14 sideEffect = false; | 14 sideEffect = false; |
15 final result = (a == b); | 15 final result = (a == b); |
16 sideEffect = !sideEffect; | 16 sideEffect = !sideEffect; |
17 return result; | 17 return result; |
18 } | 18 } |
| 19 |
19 fooDouble(a, b) => barDouble(a, b) ? 1 : 0; | 20 fooDouble(a, b) => barDouble(a, b) ? 1 : 0; |
20 | 21 |
21 barMint(a, b) { | 22 barMint(a, b) { |
22 sideEffect = false; | 23 sideEffect = false; |
23 final result = (a == b); | 24 final result = (a == b); |
24 sideEffect = !sideEffect; | 25 sideEffect = !sideEffect; |
25 return result; | 26 return result; |
26 } | 27 } |
| 28 |
27 fooMint(a, b) => barMint(a, b) ? 1 : 0; | 29 fooMint(a, b) => barMint(a, b) ? 1 : 0; |
28 | 30 |
29 class A { | 31 class A { |
30 operator == (other) => identical(this, other); | 32 operator ==(other) => identical(this, other); |
31 } | 33 } |
32 | 34 |
33 class B extends A { | 35 class B extends A {} |
34 } | |
35 | 36 |
36 class C extends A { | 37 class C extends A {} |
37 } | |
38 | 38 |
39 barPoly(a, b) { | 39 barPoly(a, b) { |
40 sideEffect = false; | 40 sideEffect = false; |
41 final result = a == b; | 41 final result = a == b; |
42 sideEffect = !sideEffect; | 42 sideEffect = !sideEffect; |
43 return result; | 43 return result; |
44 } | 44 } |
45 | 45 |
46 fooPoly(a, b) => barPoly(a, b) ? 1 : 0; | 46 fooPoly(a, b) => barPoly(a, b) ? 1 : 0; |
47 | 47 |
48 main () { | 48 main() { |
49 final a = 1.0; | 49 final a = 1.0; |
50 final b = 1 << 62; | 50 final b = 1 << 62; |
51 final x = new A(), y = new B(), z = new C(); | 51 final x = new A(), y = new B(), z = new C(); |
52 for (var i = 0; i < 20; i++) { | 52 for (var i = 0; i < 20; i++) { |
53 Expect.equals(1, fooDouble(a, a)); | 53 Expect.equals(1, fooDouble(a, a)); |
54 Expect.isTrue(sideEffect); | 54 Expect.isTrue(sideEffect); |
55 Expect.equals(0, fooMint(b, 0)); | 55 Expect.equals(0, fooMint(b, 0)); |
56 Expect.isTrue(sideEffect); | 56 Expect.isTrue(sideEffect); |
57 Expect.equals(1, fooPoly(x, x)); | 57 Expect.equals(1, fooPoly(x, x)); |
58 Expect.equals(0, fooPoly(y, x)); | 58 Expect.equals(0, fooPoly(y, x)); |
59 } | 59 } |
60 Expect.equals(1, fooDouble(z, z)); | 60 Expect.equals(1, fooDouble(z, z)); |
61 Expect.isTrue(sideEffect); | 61 Expect.isTrue(sideEffect); |
62 Expect.equals(1, fooMint(z, z)); | 62 Expect.equals(1, fooMint(z, z)); |
63 Expect.isTrue(sideEffect); | 63 Expect.isTrue(sideEffect); |
64 Expect.equals(1, fooPoly(z, z)); | 64 Expect.equals(1, fooPoly(z, z)); |
65 Expect.isTrue(sideEffect); | 65 Expect.isTrue(sideEffect); |
66 } | 66 } |
OLD | NEW |