[vm] Do not fuse constants with different representations

Issue: https://github.com/dart-lang/sdk/issues/39044
Change-Id: I19b1309adb769742b498ed0b6fe80ae38a779405
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try,dart-sdk-linux-try,flutter-engine-linux-try,analyzer-analysis-server-linux-try,analyzer-linux-release-try,front-end-linux-release-x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/122396
Commit-Queue: Daco Harkes <dacoharkes@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
This commit is contained in:
Daco Harkes
2019-10-23 12:59:28 +00:00
parent 2727fd9b3c
commit 5fd6c8a3c1
3 changed files with 38 additions and 1 deletions
@@ -123,6 +123,14 @@ DART_EXPORT int64_t IntComputation(int8_t a, int16_t b, int32_t c, int64_t d) {
return retval;
}
// Used in regress_39044_test.dart.
DART_EXPORT int64_t Regress39044(int64_t a, int8_t b) {
std::cout << "Regress39044(" << a << ", " << static_cast<int>(b) << ")\n";
const int64_t retval = a - b;
std::cout << "returning " << retval << "\n";
return retval;
}
// Performs some computation on various sized unsigned ints.
// Used for testing value ranges for unsigned ints.
DART_EXPORT int64_t UintComputation(uint8_t a,
+2 -1
View File
@@ -1117,7 +1117,8 @@ ConstantInstr::ConstantInstr(const Object& value, TokenPosition token_pos)
bool ConstantInstr::AttributesEqual(Instruction* other) const {
ConstantInstr* other_constant = other->AsConstant();
ASSERT(other_constant != NULL);
return (value().raw() == other_constant->value().raw());
return (value().raw() == other_constant->value().raw() &&
representation() == other_constant->representation());
}
UnboxedConstantInstr::UnboxedConstantInstr(const Object& value,
+28
View File
@@ -0,0 +1,28 @@
// Copyright (c) 2019, 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.
//
// Check that the optimizer does not fuse constants with different
// representations.
//
// SharedObjects=ffi_test_functions
import "dart:ffi";
import "package:expect/expect.dart";
import "dylib_utils.dart";
main() {
final ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
final intComputation = ffiTestFunctions.lookupFunction<
Int64 Function(Int64, Int8), int Function(int, int)>("Regress39044");
// The arguments are the same Smi constant, however they are different sizes.
final result = intComputation(
/* dart::kUnboxedInt64 --> int64_t */ 1,
/* dart::kUnboxedInt32 --> truncated to int8_t */ 1);
Expect.equals(0, result);
}