[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 =