blob: 4006853783f7da9e11ad3260cc627597a036daaa [file] [log] [blame]
// Copyright (c) 2018, 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.
// Verify that LoadStaticField IL instruction can't be hoisted above
// InitStaticField instruction.
import 'package:expect/expect.dart';
// Classes used to trigger deoptimization when running from app-jit snapshot.
class A {
void foo() {}
}
class B {
void foo() {}
}
// Static final field with a non-trivial initializer.
// This field will be reset before snapshot is written.
final field = (() => 'value')();
dynamic bar(dynamic o, {bool loadField: false}) {
o.foo();
// Create loop to trigger loop invariant code motion. We are testing that
// field load can't be hoisted above field initialization.
for (var i = 0; i < 2; i++) {
final v = loadField ? field : null;
if (loadField) {
return v;
}
}
return null;
}
void main(List<String> args) {
final isTraining = args.contains("--train");
dynamic o = isTraining ? new A() : new B();
for (var i = 0; i < 20000; i++) {
bar(o, loadField: false);
if (isTraining) {
// Initialize the field when training.
bar(o, loadField: true);
}
}
Expect.equals('value', bar(o, loadField: true));
print(isTraining ? 'OK(Trained)' : 'OK(Run)');
}