[vm/compiler] Fix runtime regressions in GenerateAssertAssignable.
Specifically, we used to specialize TypeParameter TTS stubs, but that
was mistakenly removed when the non-IA32 versions were unified. Also
move the int subtype check before TypeParameters as it was before.
TEST=Ran golem benchmarks before submission to verify.
Cq-Include-Trybots: luci.dart.try:vm-kernel-linux-debug-x64-try,vm-kernel-nnbd-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-kernel-nnbd-linux-debug-ia32-try,vm-kernel-precomp-linux-debug-simarm_x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-nnbd-linux-debug-simarm_x64-try,vm-kernel-precomp-nnbd-linux-debug-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-nnbd-linux-release-simarm-try,vm-kernel-nnbd-linux-release-simarm64-try,vm-kernel-precomp-linux-release-simarm-try,vm-kernel-precomp-linux-release-simarm64-try,vm-kernel-precomp-nnbd-linux-release-simarm64-try
Change-Id: I235d519c49341af76a902ac22df46c6754445a11
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/170086
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Tess Strickland <sstrickl@google.com>
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index b1e6deb..1c0f9db 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -2446,6 +2446,17 @@
return output_dst_type();
}
+ // If the int type is assignable to [dst_type] we special case it on the
+ // caller side!
+ const Type& int_type = Type::Handle(zone(), Type::IntType());
+ bool is_non_smi = false;
+ if (int_type.IsSubtypeOf(dst_type, Heap::kOld)) {
+ __ BranchIfSmi(TypeTestABI::kInstanceReg, done);
+ is_non_smi = true;
+ } else if (!receiver_type->CanBeSmi()) {
+ is_non_smi = true;
+ }
+
if (dst_type.IsTypeParameter()) {
// Special case: Instantiate the type parameter on the caller side, invoking
// the TTS of the corresponding type parameter in the caller.
@@ -2473,21 +2484,9 @@
compiler::FieldAddress(kTypeArgumentsReg,
compiler::target::TypeArguments::type_at_offset(
type_param.index())));
- elide_info = true;
return output_dst_type();
}
- // If the int type is assignable to [dst_type] we special case it on the
- // caller side!
- const Type& int_type = Type::Handle(zone(), Type::IntType());
- bool is_non_smi = false;
- if (int_type.IsSubtypeOf(dst_type, Heap::kOld)) {
- __ BranchIfSmi(TypeTestABI::kInstanceReg, done);
- is_non_smi = true;
- } else if (!receiver_type->CanBeSmi()) {
- is_non_smi = true;
- }
-
if (auto const hi = thread()->hierarchy_info()) {
const Class& type_class = Class::Handle(zone(), dst_type.type_class());