| // Copyright (c) 2011, 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 deoptimization. | |
| import "package:expect/expect.dart"; | |
| class SmiCompares { | |
| // Test deoptimization when one argument is known to be Smi. | |
| static bool smiCompareLessThan2(a) { | |
| return a < 2; | |
| } | |
| // Test deoptimization when one argument is known to be Smi. | |
| static bool smiCompareGreaterThan2(a) { | |
| return 2 < a; | |
| } | |
| // Test deoptimization when both arguments unknown. | |
| static bool smiCompareLessThan(a, b) { | |
| return a < b; | |
| } | |
| // Test deoptimization when both arguments unknown. | |
| static bool smiCompareGreaterThan(a, b) { | |
| return a > b; | |
| } | |
| static smiComparesTest() { | |
| for (int i = 0; i < 2000; i++) { | |
| Expect.equals(true, smiCompareLessThan2(1)); | |
| Expect.equals(false, smiCompareLessThan2(3)); | |
| Expect.equals(false, smiCompareGreaterThan2(1)); | |
| Expect.equals(true, smiCompareGreaterThan2(3)); | |
| Expect.equals(true, smiCompareLessThan(1, 2)); | |
| Expect.equals(false, smiCompareGreaterThan(1, 2)); | |
| } | |
| // Deoptimize by passing a double instead of Smi | |
| Expect.equals(true, smiCompareLessThan2(1.0)); | |
| Expect.equals(false, smiCompareGreaterThan2(1.0)); | |
| Expect.equals(true, smiCompareLessThan(1.0, 2)); | |
| Expect.equals(false, smiCompareGreaterThan(1, 2.0)); | |
| } | |
| } | |
| class SmiBinop { | |
| static subWithLiteral(a) { | |
| return a - 1; | |
| } | |
| static void smiBinopTest() { | |
| for (int i = 0; i < 2000; i++) { | |
| Expect.equals(2, subWithLiteral(3)); | |
| } | |
| // Deoptimize. | |
| Expect.equals(2.0, subWithLiteral(3.0)); | |
| } | |
| static mul(x) { | |
| return x * 1024; | |
| } | |
| static void smiBinopOverflowTest() { | |
| final int big = 536870912; | |
| for (int i = 0; i < 2000; i++) { | |
| Expect.equals(1024, mul(1)); | |
| } | |
| // Deoptimize by overflow. | |
| Expect.equals(1024 * big, mul(big)); | |
| } | |
| } | |
| class ObjectsEquality { | |
| static bool compareEqual(a, b) { | |
| return a == b; | |
| } | |
| static bool compareNotEqual(a, b) { | |
| return a != b; | |
| } | |
| // Use only Object.==. | |
| static void objectsEqualityTest() { | |
| var a = new ObjectsEquality(); | |
| var b = new ObjectsEquality(); | |
| for (int i = 0; i < 1000; i++) { | |
| Expect.equals(true, compareEqual(a, a)); | |
| Expect.equals(true, compareEqual(null, null)); | |
| Expect.equals(false, compareEqual(null, a)); | |
| Expect.equals(false, compareEqual(a, null)); | |
| Expect.equals(true, compareEqual(b, b)); | |
| Expect.equals(false, compareEqual(a, b)); | |
| Expect.equals(false, compareNotEqual(a, a)); | |
| Expect.equals(false, compareNotEqual(null, null)); | |
| Expect.equals(true, compareNotEqual(null, a)); | |
| Expect.equals(true, compareNotEqual(a, null)); | |
| Expect.equals(false, compareNotEqual(b, b)); | |
| Expect.equals(true, compareNotEqual(a, b)); | |
| } | |
| var c = new SmiBinop(); | |
| // Deoptimize. | |
| Expect.equals(true, compareEqual(c, c)); | |
| Expect.equals(false, compareEqual(c, null)); | |
| Expect.equals(false, compareNotEqual(c, c)); | |
| Expect.equals(true, compareNotEqual(c, null)); | |
| } | |
| } | |
| class DeoptimizationTest { | |
| static foo(a, b) { | |
| return a - b; | |
| } | |
| static test1() { | |
| for (int i = 0; i < 2000; i++) { | |
| Expect.equals(2, foo(3, 1)); // <-- Optimizes 'foo', | |
| } | |
| Expect.equals(2.2, foo(1.2, -1.0)); // <-- Deoptimizes 'foo'. | |
| for (int i = 0; i < 10000; i++) { | |
| Expect.equals(2, foo(3, 1)); // <-- Optimizes 'foo'. | |
| } | |
| Expect.equals(2.2, foo(1.2, -1)); // <-- Deoptimizes 'foo'. | |
| } | |
| static moo(n) { | |
| return ++n; | |
| } | |
| static test2() { | |
| for (int i = 0; i < 2000; i++) { | |
| Expect.equals(4, moo(3)); // <-- Optimizes 'moo', | |
| } | |
| Expect.equals(2.2, moo(1.2)); // <-- Deoptimizes 'moo'. | |
| for (int i = 0; i < 10000; i++) { | |
| Expect.equals(4, moo(3)); // <-- Optimizes 'moo'. | |
| } | |
| Expect.equals(2.2, moo(1.2)); // <-- Deoptimizes 'moo'. | |
| } | |
| static test3() { | |
| for (int i = 0; i < 2000; i++) { | |
| Expect.equals(2.0, foo(3.0, 1.0)); // <-- Optimizes 'foo', | |
| } | |
| Expect.equals(2, foo(1, -1)); // <-- Deoptimizes 'foo'. | |
| for (int i = 0; i < 2000; i++) { | |
| Expect.equals(2.0, foo(3.0, 1.0)); // <-- Optimizes 'foo', | |
| } | |
| Expect.equals(2.2, moo(1.2)); // <-- Deoptimizes 'moo'. | |
| } | |
| static bool compareInt(a, b) { | |
| return a < b; | |
| } | |
| static bool compareDouble(a, b) { | |
| return a < b; | |
| } | |
| static test4() { | |
| for (int i = 0; i < 2000; i++) { | |
| Expect.equals(true, compareInt(1, 2)); | |
| Expect.equals(true, compareDouble(1.0, 2.0)); | |
| } | |
| // Trigger deoptimization in compareInt and compareDouble. | |
| Expect.equals(true, compareInt(1, 2.0)); | |
| Expect.equals(true, compareDouble(1.0, 2)); | |
| } | |
| static smiRightShift() { | |
| int ShiftRight(int a, int b) { | |
| return a >> b; | |
| } | |
| for (int i = 0; i < 2000; i++) { | |
| var r = ShiftRight(10, 2); | |
| Expect.equals(2, r); | |
| } | |
| // ShiftRight is optimized. | |
| Expect.equals(0, ShiftRight(10, 64)); | |
| // Deoptimize ShiftRight because 'a' is a Mint. | |
| var mint = 1 << 63; | |
| Expect.equals(-1 << 3, ShiftRight(mint, 60)); | |
| } | |
| static doubleUnary() { | |
| num unary(num a) { | |
| return -a; | |
| } | |
| for (int i = 0; i < 2000; i++) { | |
| var r = unary(2.0); | |
| Expect.equals(-2.0, r); | |
| } | |
| var r = unary(5); | |
| Expect.equals(-5, r); | |
| } | |
| static void testMain() { | |
| test1(); | |
| test2(); | |
| test3(); | |
| test4(); | |
| SmiCompares.smiComparesTest(); | |
| SmiBinop.smiBinopTest(); | |
| SmiBinop.smiBinopOverflowTest(); | |
| ObjectsEquality.objectsEqualityTest(); | |
| smiRightShift(); | |
| doubleUnary(); | |
| } | |
| } | |
| main() { | |
| DeoptimizationTest.testMain(); | |
| } |