Skip to content

Commit 21b3692

Browse files
alexmarkovCommit Queue
authored and
Commit Queue
committed
[vm/aot/tfa] Speed up RTA on huge class hierarchies
Avoid iteration of all subtypes in RTA when adding selectors which are already added. This is important when number of classes is very large and hierarchy is very wide. On a huge app (41K classes) RTA time 916723ms -> 56297ms (16x faster). TEST=ci Fixes b/322854909 Change-Id: I82b3094e09c010a20065cdde64dc3d7da9fe997a Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/349143 Reviewed-by: Slava Egorov <[email protected]> Commit-Queue: Alexander Markov <[email protected]>
1 parent 6b5580d commit 21b3692

File tree

1 file changed

+14
-10
lines changed
  • pkg/vm/lib/transformations/type_flow

1 file changed

+14
-10
lines changed

pkg/vm/lib/transformations/type_flow/rta.dart

+14-10
Original file line numberDiff line numberDiff line change
@@ -151,23 +151,27 @@ class _ClassHierarchyCache {
151151

152152
void addDynamicCall(Selector selector, Class cl, RapidTypeAnalysis rta) {
153153
final ClassInfo classInfo = getClassInfo(cl);
154-
for (var sub in classInfo.subtypes) {
155-
if (sub.calledDynamicSelectors.add(selector) && sub.isAllocated) {
156-
final member = sub.getDispatchTarget(selector);
157-
if (member != null) {
158-
rta.addMember(member);
154+
if (!classInfo.calledDynamicSelectors.contains(selector)) {
155+
for (var sub in classInfo.subtypes) {
156+
if (sub.calledDynamicSelectors.add(selector) && sub.isAllocated) {
157+
final member = sub.getDispatchTarget(selector);
158+
if (member != null) {
159+
rta.addMember(member);
160+
}
159161
}
160162
}
161163
}
162164
}
163165

164166
void addVirtualCall(Selector selector, Class cl, RapidTypeAnalysis rta) {
165167
final ClassInfo classInfo = getClassInfo(cl);
166-
for (var sub in classInfo.subclasses) {
167-
if (sub.calledVirtualSelectors.add(selector) && sub.isAllocated) {
168-
final member = sub.getDispatchTarget(selector);
169-
if (member != null) {
170-
rta.addMember(member);
168+
if (!classInfo.calledVirtualSelectors.contains(selector)) {
169+
for (var sub in classInfo.subclasses) {
170+
if (sub.calledVirtualSelectors.add(selector) && sub.isAllocated) {
171+
final member = sub.getDispatchTarget(selector);
172+
if (member != null) {
173+
rta.addMember(member);
174+
}
171175
}
172176
}
173177
}

0 commit comments

Comments
 (0)