mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 19:55:23 +00:00
[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>
This commit is contained in:
parent
5ac23a0c51
commit
132bec50fc
|
@ -2446,6 +2446,17 @@ void FlowGraphCompiler::GenerateCallerChecksForAssertAssignable(
|
|||
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 @@ void FlowGraphCompiler::GenerateCallerChecksForAssertAssignable(
|
|||
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());
|
||||
|
||||
|
|
Loading…
Reference in a new issue