mirror of
https://github.com/dart-lang/sdk
synced 2024-09-05 16:41:07 +00:00
![Leaf Petersen](/assets/img/avatar_default.png)
Change-Id: Ib33169c3e0ffc870915c189404074a1dea472546 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/196548 Reviewed-by: Bob Nystrom <rnystrom@google.com> Commit-Queue: Leaf Petersen <leafp@google.com>
218 lines
5.6 KiB
Dart
218 lines
5.6 KiB
Dart
// 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.
|
|
|
|
// @dart = 2.9
|
|
|
|
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();
|
|
}
|