[dart2js] Use new call target calculation in DynamicCallSiteTypeInformation.

Change-Id: I7077df4e718cc8836aa00aa7fc37249f8c735140
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/267140
Reviewed-by: Mayank Patke <fishythefish@google.com>
Commit-Queue: Nate Biggs <natebiggs@google.com>
This commit is contained in:
Nate Biggs 2022-12-05 20:22:25 +00:00 committed by Commit Queue
parent efe18b5c4a
commit badf1c5a0e

View file

@ -1095,9 +1095,31 @@ class DynamicCallSiteTypeInformation<T extends ir.Node>
callee.removeCall(caller, _call!);
}
// TODO(natebiggs): Populate this below.
late final Set<MemberEntity> closurizedTargets = {};
void _handleCalledTarget(MemberEntity target, InferrerEngine inferrer,
{required bool addToQueue, required bool remove}) {
MemberTypeInformation targetType =
inferrer.types.getInferredTypeOfMember(target);
if (remove) {
_removeCall(targetType);
targetType.removeUser(this);
} else {
_addCall(targetType);
targetType.addUser(this);
}
final isClosurized = inferrer.updateParameterInputs(
this, target, arguments, selector,
addToQueue: addToQueue, remove: remove);
if (isClosurized) {
if (remove) {
closurizedTargets.remove(target);
} else {
closurizedTargets.add(target);
}
}
}
@override
void addToGraph(InferrerEngine inferrer) {
assert((receiver as dynamic) != null); // TODO(48820): Remove when sound.
@ -1105,19 +1127,14 @@ class DynamicCallSiteTypeInformation<T extends ir.Node>
_hasClosureCallTargets =
inferrer.closedWorld.includesClosureCall(selector!, typeMask);
final concreteTargets = _concreteTargets =
inferrer.closedWorld.locateMembers(selector!, typeMask);
inferrer.memberHierarchyBuilder.rootsForCall(typeMask, selector!);
_targetsIncludeComplexNoSuchMethod = null;
receiver.addUser(this);
if (arguments != null) {
arguments!.forEach((info) => info.addUser(this));
}
for (MemberEntity element in concreteTargets) {
MemberTypeInformation callee =
inferrer.types.getInferredTypeOfMember(element);
_addCall(callee);
callee.addUser(this);
inferrer.updateParameterInputs(this, element, arguments, selector,
remove: false, addToQueue: false);
for (final target in concreteTargets) {
_handleCalledTarget(target, inferrer, addToQueue: false, remove: false);
}
}
@ -1130,7 +1147,7 @@ class DynamicCallSiteTypeInformation<T extends ir.Node>
Iterable<MemberEntity> get concreteTargets => _concreteTargets!;
@override
Iterable<MemberEntity> get callees => _concreteTargets!;
Iterable<MemberEntity> get callees => concreteTargets;
AbstractValue? computeTypedSelector(InferrerEngine inferrer) {
AbstractValue receiverType = receiver.type;
@ -1272,8 +1289,8 @@ class DynamicCallSiteTypeInformation<T extends ir.Node>
_hasClosureCallTargets =
closedWorld.includesClosureCall(localSelector, typeMask);
final concreteTargets =
_concreteTargets = closedWorld.locateMembers(localSelector, typeMask);
final concreteTargets = _concreteTargets =
inferrer.memberHierarchyBuilder.rootsForCall(typeMask, localSelector);
// Update the call graph if the targets could have changed.
if (!identical(concreteTargets, oldTargets)) {
@ -1281,25 +1298,15 @@ class DynamicCallSiteTypeInformation<T extends ir.Node>
// Add calls to new targets to the graph.
concreteTargets
.where((target) => !oldTargets.contains(target))
.forEach((MemberEntity element) {
MemberTypeInformation callee =
inferrer.types.getInferredTypeOfMember(element);
_addCall(callee);
callee.addUser(this);
inferrer.updateParameterInputs(this, element, arguments, selector,
remove: false, addToQueue: true);
.forEach((MemberEntity target) {
_handleCalledTarget(target, inferrer, addToQueue: true, remove: false);
});
// Walk over the old targets, and remove calls that cannot happen anymore.
oldTargets
.where((target) => !concreteTargets.contains(target))
.forEach((MemberEntity element) {
MemberTypeInformation callee =
inferrer.types.getInferredTypeOfMember(element);
_removeCall(callee);
callee.removeUser(this);
inferrer.updateParameterInputs(this, element, arguments, selector,
remove: true, addToQueue: true);
.forEach((MemberEntity target) {
_handleCalledTarget(target, inferrer, addToQueue: true, remove: true);
});
}
@ -1372,15 +1379,12 @@ class DynamicCallSiteTypeInformation<T extends ir.Node>
_hasClosureCallTargets =
inferrer.closedWorld.includesClosureCall(localSelector, mask);
final newConcreteTargets = _concreteTargets =
inferrer.closedWorld.locateMembers(localSelector, mask);
inferrer.memberHierarchyBuilder.rootsForCall(mask, localSelector);
_targetsIncludeComplexNoSuchMethod = null;
for (MemberEntity element in newConcreteTargets) {
if (!oldTargets.contains(element)) {
MemberTypeInformation callee =
inferrer.types.getInferredTypeOfMember(element);
callee.addCall(caller, call);
inferrer.updateParameterInputs(this, element, arguments, selector,
remove: false, addToQueue: true);
for (MemberEntity target in newConcreteTargets) {
if (!oldTargets.contains(target)) {
_handleCalledTarget(target, inferrer,
addToQueue: true, remove: false);
}
}
}