Index: tests/language/branch_canonicalization_test.dart |
diff --git a/tests/language/branch_canonicalization_test.dart b/tests/language/branch_canonicalization_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..25cad8da5839ae746ffbde955111c2748ca3b1ef |
--- /dev/null |
+++ b/tests/language/branch_canonicalization_test.dart |
@@ -0,0 +1,68 @@ |
+// Copyright (c) 2013, 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 that branch fusion correctly sets branch environment for comparisons |
+// that require unboxing and does not fuse branches that can deoptimize. |
+ |
+var sideEffect = true; |
+ |
+barDouble(a, b) { |
+ sideEffect = false; |
+ final result = (a == b); |
+ sideEffect = !sideEffect; |
+ return result; |
+} |
+fooDouble(a, b) => barDouble(a, b) ? 1 : 0; |
+ |
+barMint(a, b) { |
+ sideEffect = false; |
+ final result = (a == b); |
Florian Schneider
2013/02/13 14:08:43
Why "final" here and "var" below in barPoly?
Vyacheslav Egorov (Google)
2013/02/13 14:10:19
cleaned up
|
+ sideEffect = !sideEffect; |
+ return result; |
+} |
+fooMint(a, b) => barMint(a, b) ? 1 : 0; |
+ |
+class A { |
+ operator == (other) => identical(this, other); |
+} |
+ |
+class B extends A { |
+} |
+ |
+class C extends A { |
+} |
+ |
+barPoly(a, b) { |
+ sideEffect = false; |
+ var x = a == b; |
+ sideEffect = !sideEffect; |
+ return x; |
+} |
+ |
+fooPoly(a, b) { |
+ var result = barPoly(a, b) ? 1 : 0; |
+ return result; |
+} |
+ |
+main () { |
+ final a = 1.0; |
+ final b = 1 << 62; |
+ final x = new A(), y = new B(), z = new C(); |
+ for (var i = 0; i < 10000; i++) { |
+ Expect.equals(1, fooDouble(a, a)); |
+ Expect.isTrue(sideEffect); |
+ Expect.equals(0, fooMint(b, 0)); |
+ Expect.isTrue(sideEffect); |
+ Expect.equals(1, fooPoly(x, x)); |
+ Expect.equals(0, fooPoly(y, x)); |
+ } |
+ Expect.equals(1, fooDouble(z, z)); |
+ Expect.isTrue(sideEffect); |
+ Expect.equals(1, fooMint(z, z)); |
+ Expect.isTrue(sideEffect); |
+ Expect.equals(1, fooPoly(z, z)); |
+ Expect.isTrue(sideEffect); |
+} |
+ |
+ |
+ |