[dart2js] Cache targetsIncludeComplexNoSuchMethod
This seems to speed up inferrer by 5-10%
Change-Id: I733159e9ec79212821444b4e502b28aa2bf81bdd
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/263220
Reviewed-by: Nate Biggs <natebiggs@google.com>
Commit-Queue: Stephen Adams <sra@google.com>
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
index ab20cd2..fa20fb2 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
@@ -1076,6 +1076,9 @@
/// Cached concrete targets of this call.
Iterable<MemberEntity>? _concreteTargets;
+ /// Recomputed when _concreteTargets changes.
+ bool? _targetsIncludeComplexNoSuchMethod;
+
DynamicCallSiteTypeInformation(
AbstractValueDomain abstractValueDomain,
MemberTypeInformation context,
@@ -1109,6 +1112,7 @@
inferrer.closedWorld.includesClosureCall(selector!, typeMask);
final concreteTargets = _concreteTargets =
inferrer.closedWorld.locateMembers(selector!, typeMask);
+ _targetsIncludeComplexNoSuchMethod = null;
receiver.addUser(this);
if (arguments != null) {
arguments!.forEach((info) => info.addUser(this));
@@ -1146,7 +1150,8 @@
}
bool targetsIncludeComplexNoSuchMethod(InferrerEngine inferrer) {
- return _concreteTargets!.any((MemberEntity e) {
+ return _targetsIncludeComplexNoSuchMethod ??=
+ _concreteTargets!.any((MemberEntity e) {
return e.isFunction &&
e.isInstanceMember &&
e.name == Identifiers.noSuchMethod_ &&
@@ -1278,6 +1283,7 @@
// Update the call graph if the targets could have changed.
if (!identical(concreteTargets, oldTargets)) {
+ _targetsIncludeComplexNoSuchMethod = null;
// Add calls to new targets to the graph.
concreteTargets
.where((target) => !oldTargets.contains(target))
@@ -1372,6 +1378,7 @@
inferrer.closedWorld.includesClosureCall(localSelector, mask);
final newConcreteTargets = _concreteTargets =
inferrer.closedWorld.locateMembers(localSelector, mask);
+ _targetsIncludeComplexNoSuchMethod = null;
for (MemberEntity element in newConcreteTargets) {
if (!oldTargets.contains(element)) {
MemberTypeInformation callee =