Skip to content

Commit 23ee425

Browse files
askeksacommit-bot@chromium.org
authored andcommitted
[vm/aot/tfa] Signature shaking for both static and instance methods
The existing signature shaker transforms optional and named parameters of static and top-level methods and constructors into required parameters whenever they are always passed. This change improves signature shaking in a number of areas: - Extend signature shaking to cover instance methods. - Remove parameters which are never passed. - Remove parameters which are not used. - Transform signatures before unboxing, enabling transformed parameters to be unboxed. TFA summaries for transformed functions are updated to stay in sync with the program for later transformations. Reduces instructions size of Flutter Gallery on ARM64 by 2.2%. Issue: #40488 Change-Id: I39e364bc23b01e4502864d7369a745a9278cfb92 Cq-Do-Not-Cancel-Tryjobs: true Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/161175 Commit-Queue: Aske Simon Christensen <[email protected]> Reviewed-by: Martin Kustermann <[email protected]> Reviewed-by: Alexander Markov <[email protected]>
1 parent 8f193a3 commit 23ee425

40 files changed

+1263
-601
lines changed

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

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1535,14 +1535,13 @@ class TypeFlowAnalysis implements EntryPointsListener, CallHandler {
15351535

15361536
Args<Type> argumentTypes(Member member) => _summaries[member]?.argumentTypes;
15371537

1538+
Type argumentType(Member member, VariableDeclaration memberParam) {
1539+
return _summaries[member]?.argumentType(member, memberParam);
1540+
}
1541+
15381542
List<VariableDeclaration> uncheckedParameters(Member member) =>
15391543
_summaries[member]?.uncheckedParameters;
15401544

1541-
// The set of optional and named parameters to this procedure which
1542-
// are passed at all call-sites.
1543-
Set<String> alwaysPassedOptionalParameters(Member member) =>
1544-
_summaries[member]?.alwaysPassedOptionalParameters() ?? const {};
1545-
15461545
bool isTearOffTaken(Member member) => _tearOffTaken.contains(member);
15471546

15481547
/// Returns true if this member is called on a receiver with static type
@@ -1565,6 +1564,12 @@ class TypeFlowAnalysis implements EntryPointsListener, CallHandler {
15651564
_methodsAndSettersCalledDynamically.contains(member) ||
15661565
_calledViaInterfaceSelector.contains(member);
15671566

1567+
/// Update the summary parameters to reflect a signature change with moved
1568+
/// and/or removed parameters.
1569+
void adjustFunctionParameters(Member member) {
1570+
_summaries[member]?.adjustFunctionParameters(member);
1571+
}
1572+
15681573
/// ---- Implementation of [CallHandler] interface. ----
15691574
15701575
@override
@@ -1648,4 +1653,9 @@ class TypeFlowAnalysis implements EntryPointsListener, CallHandler {
16481653
void recordMemberCalledViaThis(Member target) {
16491654
_calledViaThis.add(target);
16501655
}
1656+
1657+
@override
1658+
void recordTearOff(Procedure target) {
1659+
_tearOffTaken.add(target);
1660+
}
16511661
}

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

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -187,20 +187,15 @@ class Args<T extends TypeExpr> {
187187
final List<T> values;
188188
final List<String> names;
189189

190-
// Whether it is not known which optional arguments are passed or not.
191-
final bool unknownArity;
192-
193190
int _hashCode;
194191

195-
Args(this.values,
196-
{this.names = const <String>[], this.unknownArity = false}) {
192+
Args(this.values, {this.names = const <String>[]}) {
197193
assert(isSorted(names));
198194
}
199195

200196
Args.withReceiver(Args<T> args, T receiver)
201197
: values = new List.from(args.values),
202-
names = args.names,
203-
unknownArity = args.unknownArity {
198+
names = args.names {
204199
values[0] = receiver;
205200
}
206201

@@ -220,7 +215,6 @@ class Args<T extends TypeExpr> {
220215
for (var n in names) {
221216
hash = (((hash * 31) & kHashMask) + n.hashCode) & kHashMask;
222217
}
223-
if (unknownArity) hash ^= -1;
224218
return hash;
225219
}
226220

@@ -240,7 +234,7 @@ class Args<T extends TypeExpr> {
240234
return false;
241235
}
242236
}
243-
return unknownArity == other.unknownArity;
237+
return true;
244238
}
245239
return false;
246240
}
@@ -263,11 +257,7 @@ class Args<T extends TypeExpr> {
263257
buf.write(': ');
264258
buf.write(values[positionalCount + i]);
265259
}
266-
if (unknownArity) {
267-
buf.write(", <unknown arity>)");
268-
} else {
269-
buf.write(")");
270-
}
260+
buf.write(")");
271261
return buf.toString();
272262
}
273263
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ abstract class EntryPointsListener {
3232

3333
/// Record the fact that given member is called from this.
3434
void recordMemberCalledViaThis(Member target);
35+
36+
/// Record the fact that given method is torn off.
37+
void recordTearOff(Procedure target) {}
3538
}
3639

3740
class PragmaEntryPointsVisitor extends RecursiveVisitor {

0 commit comments

Comments
 (0)