blob: 1fb021c30a0bfe7d320b9a16df452f80b1f783f7 [file] [log] [blame]
// Copyright (c) 2013, 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
// dart2js regression test where the SSA backend would use the wrong
// type for an instruction: when doing a speculative type propagation,
// if an instruction gets analyzed multiple times, we used to save the
// last inferred type, which could be speculative, instead of the
// first inferred type, which is the actual, non-speculative, type.
//
// Because we are doing speculative type propagation at the very end,
// before emitting the bailout version, the only place where we might
// do wrong optimizations is during the codegen. It turns out that the
// codegen optimizes '==' comparisons on null to '===' in case it knows
// the receiver cannot be null. So in the following example, the
// [:e == null:] comparison in [foo] got wrongly generated to a
// JavaScript identity check (that is, using '==='). But this
// comparison does not work for undefined, which the DOM sometimes
// returns.
import "native_testing.dart";
var a = 42;
var b = 0;
foo(e) {
// Loop to force a bailout.
for (int i = 0; i < b; i++) {
a = e[i]; // Will desire a readable primitive.
}
// Our heuristics for '==' on an indexable primitive is that it's
// more common to do it on string, so we'll want e to be a string.
return a == e || e == null;
}
main() {
Expect.isTrue(foo(JS('', 'void 0')));
}