Version 2.14.0-70.0.dev
Merge commit 'cb636850dffc9484a978229a11d80d84eabe1aa4' into 'dev'
diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc
index ead29a0..2d890b4 100644
--- a/runtime/vm/compiler/backend/flow_graph.cc
+++ b/runtime/vm/compiler/backend/flow_graph.cc
@@ -1613,6 +1613,10 @@
return;
}
+ // Current_context_var is never pruned, it is artificially kept alive, so
+ // it should not be checked here.
+ const intptr_t current_context_var_index = CurrentContextEnvIndex();
+
for (intptr_t i = 0, n = preorder().length(); i < n; ++i) {
BlockEntryInstr* block_entry = preorder()[i];
Instruction* last_instruction = block_entry->last_instruction();
@@ -1624,7 +1628,7 @@
if (successor->phis() != NULL) {
for (intptr_t j = 0; j < successor->phis()->length(); ++j) {
PhiInstr* phi = (*successor->phis())[j];
- if (phi == nullptr) {
+ if (phi == nullptr && j != current_context_var_index) {
// We have no phi node for the this variable.
// Double check we do not have a different value in our env.
// If we do, we would have needed a phi-node in the successsor.
diff --git a/runtime/vm/compiler/backend/flow_graph.h b/runtime/vm/compiler/backend/flow_graph.h
index dbbd124..4e72259 100644
--- a/runtime/vm/compiler/backend/flow_graph.h
+++ b/runtime/vm/compiler/backend/flow_graph.h
@@ -651,8 +651,8 @@
const GrowableArray<BlockEntryInstr*>& postorder_;
// Live-out sets for each block. They contain indices of variables
- // that are live out from this block: that is values that were either
- // defined in this block or live into it and that are used in some
+ // that are live out from this block. That is values that were (1) either
+ // defined in this block or live into it, and (2) that are used in some
// successor block.
GrowableArray<BitVector*> live_out_;
diff --git a/tests/language/vm/regress_45855_test.dart b/tests/language/vm/regress_45855_test.dart
new file mode 100644
index 0000000..14200e4
--- /dev/null
+++ b/tests/language/vm/regress_45855_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2021, 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.
+//
+// VMOptions=--optimization-counter-threshold=100 --deterministic
+//
+// The Dart Project Fuzz Tester (1.89).
+// Program generated as:
+// dart dartfuzz.dart --seed 928581289 --no-fp --ffi --no-flat
+//
+// Minimized.
+
+@pragma('vm:never-inline')
+void main2(bool? boolParam) {
+ for (int i = 0; i < 200; i++) {
+ final bool1 = boolParam ?? false;
+ if (bool1) {
+ () {
+ // Force creating a new current context.
+ i.toString();
+ };
+ // Force having multiple paths to the exit, popping the current context.
+ break;
+ }
+ }
+}
+
+void main() {
+ // Test OSR.
+ main2(null);
+
+ // Test non-OSR.
+ main2(null);
+}
diff --git a/tests/language_2/vm/regress_45855_test.dart b/tests/language_2/vm/regress_45855_test.dart
new file mode 100644
index 0000000..b99676e
--- /dev/null
+++ b/tests/language_2/vm/regress_45855_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2021, 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.
+//
+// VMOptions=--optimization-counter-threshold=100 --deterministic
+//
+// The Dart Project Fuzz Tester (1.89).
+// Program generated as:
+// dart dartfuzz.dart --seed 928581289 --no-fp --ffi --no-flat
+//
+// Minimized.
+
+@pragma('vm:never-inline')
+void main2(bool boolParam) {
+ for (int i = 0; i < 200; i++) {
+ final bool1 = boolParam ?? false;
+ if (bool1) {
+ () {
+ // Force creating a new current context.
+ i.toString();
+ };
+ // Force having multiple paths to the exit, popping the current context.
+ break;
+ }
+ }
+}
+
+void main() {
+ // Test OSR.
+ main2(null);
+
+ // Test non-OSR.
+ main2(null);
+}
diff --git a/tools/VERSION b/tools/VERSION
index 134fd10..43fcd00 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 14
PATCH 0
-PRERELEASE 69
+PRERELEASE 70
PRERELEASE_PATCH 0
\ No newline at end of file