Skip to content

Commit

Permalink
[vm/aot/tfa] Signature shaking for both static and instance methods
Browse files Browse the repository at this point in the history
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 <askesc@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
  • Loading branch information
askeksa authored and commit-bot@chromium.org committed Oct 26, 2020
1 parent 8f193a3 commit 23ee425
Show file tree
Hide file tree
Showing 40 changed files with 1,263 additions and 601 deletions.
20 changes: 15 additions & 5 deletions pkg/vm/lib/transformations/type_flow/analysis.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1535,14 +1535,13 @@ class TypeFlowAnalysis implements EntryPointsListener, CallHandler {

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

Type argumentType(Member member, VariableDeclaration memberParam) {
return _summaries[member]?.argumentType(member, memberParam);
}

List<VariableDeclaration> uncheckedParameters(Member member) =>
_summaries[member]?.uncheckedParameters;

// The set of optional and named parameters to this procedure which
// are passed at all call-sites.
Set<String> alwaysPassedOptionalParameters(Member member) =>
_summaries[member]?.alwaysPassedOptionalParameters() ?? const {};

bool isTearOffTaken(Member member) => _tearOffTaken.contains(member);

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

/// Update the summary parameters to reflect a signature change with moved
/// and/or removed parameters.
void adjustFunctionParameters(Member member) {
_summaries[member]?.adjustFunctionParameters(member);
}

/// ---- Implementation of [CallHandler] interface. ----
@override
Expand Down Expand Up @@ -1648,4 +1653,9 @@ class TypeFlowAnalysis implements EntryPointsListener, CallHandler {
void recordMemberCalledViaThis(Member target) {
_calledViaThis.add(target);
}

@override
void recordTearOff(Procedure target) {
_tearOffTaken.add(target);
}
}
18 changes: 4 additions & 14 deletions pkg/vm/lib/transformations/type_flow/calls.dart
Original file line number Diff line number Diff line change
Expand Up @@ -187,20 +187,15 @@ class Args<T extends TypeExpr> {
final List<T> values;
final List<String> names;

// Whether it is not known which optional arguments are passed or not.
final bool unknownArity;

int _hashCode;

Args(this.values,
{this.names = const <String>[], this.unknownArity = false}) {
Args(this.values, {this.names = const <String>[]}) {
assert(isSorted(names));
}

Args.withReceiver(Args<T> args, T receiver)
: values = new List.from(args.values),
names = args.names,
unknownArity = args.unknownArity {
names = args.names {
values[0] = receiver;
}

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

Expand All @@ -240,7 +234,7 @@ class Args<T extends TypeExpr> {
return false;
}
}
return unknownArity == other.unknownArity;
return true;
}
return false;
}
Expand All @@ -263,11 +257,7 @@ class Args<T extends TypeExpr> {
buf.write(': ');
buf.write(values[positionalCount + i]);
}
if (unknownArity) {
buf.write(", <unknown arity>)");
} else {
buf.write(")");
}
buf.write(")");
return buf.toString();
}
}
3 changes: 3 additions & 0 deletions pkg/vm/lib/transformations/type_flow/native_code.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ abstract class EntryPointsListener {

/// Record the fact that given member is called from this.
void recordMemberCalledViaThis(Member target);

/// Record the fact that given method is torn off.
void recordTearOff(Procedure target) {}
}

class PragmaEntryPointsVisitor extends RecursiveVisitor {
Expand Down
Loading

0 comments on commit 23ee425

Please sign in to comment.