20faaa5d94
Change-Id: Ib18f554c1076f27a3f7c0df5a36410da41a1f467 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/148784 Reviewed-by: Paul Berry <paulberry@google.com> Reviewed-by: Sigmund Cherem <sigmund@google.com>
74 lines
2.2 KiB
Dart
74 lines
2.2 KiB
Dart
// Copyright (c) 2012, 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.7
|
|
|
|
import 'package:expect/expect.dart';
|
|
import 'package:async_helper/async_helper.dart';
|
|
import '../helpers/compiler_helper.dart';
|
|
|
|
const String FIB = r"""
|
|
fib(n) {
|
|
if (n <= 1) return 1;
|
|
return add(fib(n - 1), fib(n - 2));
|
|
}
|
|
|
|
// We need this artificial add method because
|
|
// our optimizer will actually add type checks
|
|
// for the result of recursively calling fib
|
|
// which introduces new variables because we
|
|
// now have multiple users.
|
|
// The 'if' has been added to avoid inlining of add.
|
|
add(x, y) {
|
|
if (x == -1) return x;
|
|
return x + y;
|
|
}
|
|
""";
|
|
|
|
const String BAR = r"""
|
|
bar() {
|
|
var isLeaf = (bar() != null) && bar();
|
|
// Because we're using a local variable, the graph gets an empty
|
|
// block between the [isLeaf] phi and the next instruction that uses
|
|
// it. The optimizer must take that new block into account in order
|
|
// to have the phi be generate at use uste.
|
|
if (isLeaf) return null;
|
|
return true;
|
|
}
|
|
""";
|
|
|
|
// Test that a synthesized [HTypeConversion] node added due to the is
|
|
// check is code motion invariant. No 'else' should be generated in
|
|
// this code snippet (the new [HTypeConversion] is put in the else
|
|
// branch, but the else branch dominates the rest of the code in this
|
|
// snippet).
|
|
const String TEST = r"""
|
|
foo(a) {
|
|
if (a is !int) throw a;
|
|
if (a < 0) throw a;
|
|
return a + a;
|
|
}
|
|
""";
|
|
|
|
main() {
|
|
runTests() async {
|
|
// Make sure we don't introduce a new variable.
|
|
await compileAndDoNotMatch(FIB, 'fib', new RegExp("var $anyIdentifier ="));
|
|
|
|
await compileAndDoNotMatch(BAR, 'bar', new RegExp("isLeaf"));
|
|
|
|
await compile(TEST, entry: 'foo', check: (String generated) {
|
|
Expect.isFalse(generated.contains('else'));
|
|
// Regression check to ensure that there is no floating variable
|
|
// expression.
|
|
Expect.isFalse(new RegExp('^[ ]*a;').hasMatch(generated));
|
|
});
|
|
}
|
|
|
|
asyncTest(() async {
|
|
print('--test from kernel------------------------------------------------');
|
|
await runTests();
|
|
});
|
|
}
|