Skip to content

Commit 6cb9397

Browse files
natebiggsCommit Queue
authored and
Commit Queue
committed
[dart2js] Add cache to FlatTypeMask.interesection
Both the calls to ClassHierarchy.commonSubclasses and UnionTypeMask.flatten (in the worse case) are expensive for large programs. Certain programs can have a type structure that ends up in the UnionTypeMask.flatten case very often which can be especially taxing. Change-Id: I7799d2f5a7f764162a4ca753bfa37b11f583373f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/269221 Commit-Queue: Nate Biggs <[email protected]> Reviewed-by: Stephen Adams <[email protected]>
1 parent 4ee2a6b commit 6cb9397

File tree

4 files changed

+14
-0
lines changed

4 files changed

+14
-0
lines changed

pkg/compiler/lib/src/inferrer/typemasks/flat_type_mask.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,11 @@ class FlatTypeMask extends TypeMask {
436436

437437
@override
438438
TypeMask intersection(TypeMask other, CommonMasks domain) {
439+
return (domain._intersectionCache[this] ??= {})[other] ??=
440+
_intersection(other, domain);
441+
}
442+
443+
TypeMask _intersection(TypeMask other, CommonMasks domain) {
439444
if (other is! FlatTypeMask) return other.intersection(this, domain);
440445
assert(TypeMask.assertIsNormalized(this, domain._closedWorld));
441446
assert(TypeMask.assertIsNormalized(other, domain._closedWorld));

pkg/compiler/lib/src/inferrer/typemasks/masks.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ class CommonMasks with AbstractValueDomain {
4545
CommonElements get commonElements => _closedWorld.commonElements;
4646
DartTypes get dartTypes => _closedWorld.dartTypes;
4747

48+
final Map<TypeMask, Map<TypeMask, TypeMask>> _intersectionCache = {};
49+
4850
/// Cache of [FlatTypeMask]s grouped by the possible values of the
4951
/// `FlatTypeMask.flags` property.
5052
final List<Map<ClassEntity, TypeMask>?> _canonicalizedTypeMasks = List.filled(

pkg/compiler/lib/src/inferrer_experimental/typemasks/flat_type_mask.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,11 @@ class FlatTypeMask extends TypeMask {
436436

437437
@override
438438
TypeMask intersection(TypeMask other, CommonMasks domain) {
439+
return (domain._intersectionCache[this] ??= {})[other] ??=
440+
_intersection(other, domain);
441+
}
442+
443+
TypeMask _intersection(TypeMask other, CommonMasks domain) {
439444
if (other is! FlatTypeMask) return other.intersection(this, domain);
440445
assert(TypeMask.assertIsNormalized(this, domain._closedWorld));
441446
assert(TypeMask.assertIsNormalized(other, domain._closedWorld));

pkg/compiler/lib/src/inferrer_experimental/typemasks/masks.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ class CommonMasks with AbstractValueDomain {
4545
CommonElements get commonElements => _closedWorld.commonElements;
4646
DartTypes get dartTypes => _closedWorld.dartTypes;
4747

48+
final Map<TypeMask, Map<TypeMask, TypeMask>> _intersectionCache = {};
49+
4850
/// Cache of [FlatTypeMask]s grouped by the possible values of the
4951
/// `FlatTypeMask.flags` property.
5052
final List<Map<ClassEntity, TypeMask>?> _canonicalizedTypeMasks = List.filled(

0 commit comments

Comments
 (0)