blob: 77acbf8818173a20e68177f1d7abee9b3b71c811 [file] [log] [blame]
// 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) {
// 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();