From 37ea0f8cb41b1f26061d258f8a1e85ba1bee33a8 Mon Sep 17 00:00:00 2001 From: Ryan Macnak Date: Wed, 18 Aug 2021 23:19:55 +0000 Subject: [PATCH] [vm, compiler] Don't clobber non-writable inputs in BinarySmiOp(>>>). TEST=ci Bug: https://github.com/dart-lang/sdk/issues/46797 Change-Id: Ia9494ddc1d39b83e2572b8b5a7f208da2540ccd1 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/210501 Reviewed-by: Alexander Markov Commit-Queue: Ryan Macnak --- runtime/tests/vm/dart/regress_46797_test.dart | 21 +++++++++++++++++++ runtime/vm/compiler/backend/il_arm64.cc | 4 ++-- 2 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 runtime/tests/vm/dart/regress_46797_test.dart diff --git a/runtime/tests/vm/dart/regress_46797_test.dart b/runtime/tests/vm/dart/regress_46797_test.dart new file mode 100644 index 00000000000..ceb5f0af734 --- /dev/null +++ b/runtime/tests/vm/dart/regress_46797_test.dart @@ -0,0 +1,21 @@ +// 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 + +int var74 = -43; + +@pragma("vm:never-inline") +foo(int var74) { + if (var74 >>> 0xC == 675872701) { + print("side-effect"); + } +} + +main() { + for (var i = 0; i < 200; i++) { + foo(43); + } + foo(-43); +} diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc index 9484c2606a8..0262af5b6d0 100644 --- a/runtime/vm/compiler/backend/il_arm64.cc +++ b/runtime/vm/compiler/backend/il_arm64.cc @@ -3541,8 +3541,8 @@ void BinarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { const intptr_t kCountLimit = 0x3F; intptr_t value = Smi::Cast(constant).Value(); ASSERT((value >= 0) && (value <= kCountLimit)); - __ SmiUntag(left); - __ LsrImmediate(result, left, value); + __ SmiUntag(result, left); + __ LsrImmediate(result, result, value); if (deopt != nullptr) { __ SmiTagAndBranchIfOverflow(result, deopt); } else {