Skip to content

Commit

Permalink
[vm] Add specialized factory constructors for small list literals
Browse files Browse the repository at this point in the history
Flutter gallery in release mode:
AOT snapshot size arm64 -0.22%, arm -0.21%
instructions size arm64 -0.46%, arm -0.4%

TEST=existing tests

Fixes dart-lang/sdk#44391

Change-Id: I4733e91ecf4601c0bcde725cf9e97f5db0b8bc13
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/175821
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
  • Loading branch information
alexmarkov authored and commit-bot@chromium.org committed Jan 11, 2021
1 parent 1941ee0 commit 9d1a307
Show file tree
Hide file tree
Showing 293 changed files with 1,555 additions and 1,370 deletions.
10 changes: 9 additions & 1 deletion pkg/front_end/lib/src/fasta/source/source_loader.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1464,10 +1464,18 @@ class List<E> extends Iterable<E> {
}
class _GrowableList<E> {
factory _GrowableList() => null;
factory _GrowableList(int length) => null;
factory _GrowableList.empty() => null;
factory _GrowableList.filled() => null;
factory _GrowableList.generate(int length, E generator(int index)) => null;
factory _GrowableList._literal1(E e0) => null;
factory _GrowableList._literal2(E e0, E e1) => null;
factory _GrowableList._literal3(E e0, E e1, E e2) => null;
factory _GrowableList._literal4(E e0, E e1, E e2, E e3) => null;
factory _GrowableList._literal5(E e0, E e1, E e2, E e3, E e4) => null;
factory _GrowableList._literal6(E e0, E e1, E e2, E e3, E e4, E e5) => null;
factory _GrowableList._literal7(E e0, E e1, E e2, E e3, E e4, E e5, E e6) => null;
factory _GrowableList._literal8(E e0, E e1, E e2, E e3, E e4, E e5, E e6, E e7) => null;
}
class _List<E> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Errors: {
^^^^^^^^^
}
method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
return #lib1::globalVar.{dart.core::num::+}(invalid-expression "org-dartlang-debug:synthetic_debug_expression:1:13: Error: Getter not found: 'staticVar'.\nglobalVar + staticVar + 5\n ^^^^^^^^^" as{TypeError,ForDynamic} dart.core::num*).{dart.core::num::+}(5);
return #lib1::globalVar.{dart.core::num::+}(invalid-expression "org-dartlang-debug:synthetic_debug_expression:1:13: Error: Getter not found: 'staticVar'.\nglobalVar + staticVar + 5\n ^^^^^^^^^").{dart.core::num::+}(5);
Errors: {
}
static method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
Errors: {
}
method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic s) → dynamic
return this.{main::D::m}(this.{main::D::id}<dart.core::List<main::D::T*>*>((s = <dynamic>[]) as{TypeError} dart.core::List<main::D::T*>*));
return this.{main::D::m}(this.{main::D::id}<dart.core::List<main::D::T*>*>((s = dart.core::_GrowableList::•<dynamic>(0)) as{TypeError} dart.core::List<main::D::T*>*));
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@ Errors: {
}
method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
return block {
final dart.core::Set<dart.core::String*>* #t1 = dart.collection::LinkedHashSet::•<dart.core::String*>();
final dart.core::Set<dart.core::String*>* #t1 = new dart.collection::_CompactLinkedHashSet::•<dart.core::String*>();
#t1.{dart.core::Set::add}{Invariant}("a");
} =>#t1;
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ extension A<T extends core::Object* = dynamic> on core::List<T*>* {
method myMap = self::A|myMap;
tearoff myMap = self::A|get#myMap;
}
static final field core::List<core::String*>* list = self::A|myMap<core::String*, core::String*>(<core::String*>["a", "b", "c"], (core::String* it) → core::String* => it);
static final field core::List<core::String*>* list = self::A|myMap<core::String*, core::String*>(core::_GrowableList::_literal3<core::String*>("a", "b", "c"), (core::String* it) → core::String* => it);
static method A|myMap<T extends core::Object* = dynamic, R extends core::Object* = dynamic>(lowered final core::List<self::A|myMap::T*>* #this, (self::A|myMap::T*) →* self::A|myMap::R* block) → core::List<self::A|myMap::R*>* {
return #this.{core::Iterable::map}<self::A|myMap::R*>(block).{core::Iterable::toList}();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,7 @@ class EqualityConstraint extends self::BinaryConstraint {
}
}
class Variable extends core::Object {
field core::List<self::Constraint*>* constraints = <self::Constraint*>[];
field core::List<self::Constraint*>* constraints = core::_GrowableList::•<self::Constraint*>(0);
field self::Constraint* determinedBy = null;
field core::int* mark = 0;
field self::Strength* walkStrength = #C18;
Expand Down Expand Up @@ -337,7 +337,7 @@ class Planner extends core::Object {
return plan;
}
method extractPlanFromConstraints(core::List<self::Constraint*>* constraints) → self::Plan* {
core::List<self::Constraint*>* sources = <self::Constraint*>[];
core::List<self::Constraint*>* sources = core::_GrowableList::•<self::Constraint*>(0);
for (core::int* i = 0; i.{core::num::<}(constraints.{core::List::length}); i = i.{core::num::+}(1)) {
self::Constraint* c = constraints.{core::List::[]}(i);
if(c.{self::Constraint::isInput}() && c.{self::Constraint::isSatisfied}())
Expand All @@ -346,7 +346,7 @@ class Planner extends core::Object {
return this.{self::Planner::makePlan}(sources);
}
method addPropagate(self::Constraint* c, core::int* mark) → core::bool* {
core::List<self::Constraint*>* todo = <self::Constraint*>[c];
core::List<self::Constraint*>* todo = core::_GrowableList::_literal1<self::Constraint*>(c);
while (todo.{core::List::length}.{core::num::>}(0)) {
self::Constraint* d = todo.{core::List::removeLast}();
if(d.{self::Constraint::output}().{self::Variable::mark}.{core::num::==}(mark)) {
Expand All @@ -362,8 +362,8 @@ class Planner extends core::Object {
out.{self::Variable::determinedBy} = null;
out.{self::Variable::walkStrength} = #C18;
out.{self::Variable::stay} = true;
core::List<self::Constraint*>* unsatisfied = <self::Constraint*>[];
core::List<self::Variable*>* todo = <self::Variable*>[out];
core::List<self::Constraint*>* unsatisfied = core::_GrowableList::•<self::Constraint*>(0);
core::List<self::Variable*>* todo = core::_GrowableList::_literal1<self::Variable*>(out);
while (todo.{core::List::length}.{core::num::>}(0)) {
self::Variable* v = todo.{core::List::removeLast}();
for (core::int* i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
Expand Down Expand Up @@ -402,7 +402,7 @@ class Planner extends core::Object {
abstract member-signature get runtimeType() → core::Type*; -> core::Object::runtimeType
}
class Plan extends core::Object {
field core::List<self::Constraint*>* list = <self::Constraint*>[];
field core::List<self::Constraint*>* list = core::_GrowableList::•<self::Constraint*>(0);
synthetic constructor •() → self::Plan*
: super core::Object::•()
;
Expand Down Expand Up @@ -458,7 +458,7 @@ static method chainTest(core::int* n) → void {
}
new self::StayConstraint::•(last, #C9);
self::EditConstraint* edit = new self::EditConstraint::•(first, #C6);
self::Plan* plan = self::planner.{self::Planner::extractPlanFromConstraints}(<self::Constraint*>[edit]);
self::Plan* plan = self::planner.{self::Planner::extractPlanFromConstraints}(core::_GrowableList::_literal1<self::Constraint*>(edit));
for (core::int* i = 0; i.{core::num::<}(100); i = i.{core::num::+}(1)) {
first.{self::Variable::value} = i;
plan.{self::Plan::execute}();
Expand All @@ -474,7 +474,7 @@ static method projectionTest(core::int* n) → void {
self::Variable* offset = new self::Variable::•("offset", 1000);
self::Variable* src = null;
self::Variable* dst = null;
core::List<self::Variable*>* dests = <self::Variable*>[];
core::List<self::Variable*>* dests = core::_GrowableList::•<self::Variable*>(0);
for (core::int* i = 0; i.{core::num::<}(n); i = i.{core::num::+}(1)) {
src = new self::Variable::•("src", i);
dst = new self::Variable::•("dst", i);
Expand All @@ -501,7 +501,7 @@ static method projectionTest(core::int* n) → void {
}
static method change(self::Variable* v, core::int* newValue) → void {
self::EditConstraint* edit = new self::EditConstraint::•(v, #C6);
self::Plan* plan = self::planner.{self::Planner::extractPlanFromConstraints}(<self::EditConstraint*>[edit]);
self::Plan* plan = self::planner.{self::Planner::extractPlanFromConstraints}(core::_GrowableList::_literal1<self::EditConstraint*>(edit));
for (core::int* i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
v.{self::Variable::value} = newValue;
plan.{self::Plan::execute}();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,5 @@ static method loop(core::List<dynamic>* xs) → void {
static method main() → dynamic {
self::foo(4, 5);
self::foo(6, 7);
self::loop(<dynamic>["dfg"]);
self::loop(core::_GrowableList::_literal1<dynamic>("dfg"));
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import "dart:_internal" as _in;

import "dart:async";

static field core::List<core::String*>* stringList = <core::String*>["bar"];
static field core::List<core::String*>* stringList = core::_GrowableList::_literal1<core::String*>("bar");
static method asyncString() → asy::Future<core::String*>* /* originally async */ {
final asy::_Future<core::String*>* :async_future = new asy::_Future::•<core::String*>();
core::bool* :is_sync = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,18 +44,18 @@ static method main() → void /* originally async */ {
#L1:
{
core::String* expected = "1 2 3 4 5 6 7 8 9 10";
:async_temporary_2 = new self::Node::•("2", <self::Node*>[]);
[yield] let dynamic #t4 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("7", <self::Node*>[])), :async_op_then, :async_op_error, :async_op) in null;
[yield] let dynamic #t5 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("6", <self::Node*>[_in::unsafeCast<self::Node*>(:result)])), :async_op_then, :async_op_error, :async_op) in null;
:async_temporary_2 = new self::Node::•("2", core::_GrowableList::•<self::Node*>(0));
[yield] let dynamic #t4 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("7", core::_GrowableList::•<self::Node*>(0))), :async_op_then, :async_op_error, :async_op) in null;
[yield] let dynamic #t5 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("6", core::_GrowableList::_literal1<self::Node*>(_in::unsafeCast<self::Node*>(:result)))), :async_op_then, :async_op_error, :async_op) in null;
:async_temporary_1 = _in::unsafeCast<self::Node*>(:result);
[yield] let dynamic #t6 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("8", <self::Node*>[])), :async_op_then, :async_op_error, :async_op) in null;
[yield] let dynamic #t6 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("8", core::_GrowableList::•<self::Node*>(0))), :async_op_then, :async_op_error, :async_op) in null;
:async_temporary_0 = _in::unsafeCast<self::Node*>(:result);
[yield] let dynamic #t7 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("9", <self::Node*>[])), :async_op_then, :async_op_error, :async_op) in null;
[yield] let dynamic #t8 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("4", <self::Node*>[new self::Node::•("5", <self::Node*>[_in::unsafeCast<self::Node*>(:async_temporary_1), _in::unsafeCast<self::Node*>(:async_temporary_0), _in::unsafeCast<self::Node*>(:result)])])), :async_op_then, :async_op_error, :async_op) in null;
[yield] let dynamic #t9 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("3", <self::Node*>[_in::unsafeCast<self::Node*>(:result)])), :async_op_then, :async_op_error, :async_op) in null;
[yield] let dynamic #t7 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("9", core::_GrowableList::•<self::Node*>(0))), :async_op_then, :async_op_error, :async_op) in null;
[yield] let dynamic #t8 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("4", core::_GrowableList::_literal1<self::Node*>(new self::Node::•("5", core::_GrowableList::_literal3<self::Node*>(_in::unsafeCast<self::Node*>(:async_temporary_1), _in::unsafeCast<self::Node*>(:async_temporary_0), _in::unsafeCast<self::Node*>(:result)))))), :async_op_then, :async_op_error, :async_op) in null;
[yield] let dynamic #t9 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("3", core::_GrowableList::_literal1<self::Node*>(_in::unsafeCast<self::Node*>(:result)))), :async_op_then, :async_op_error, :async_op) in null;
:async_temporary_0 = _in::unsafeCast<self::Node*>(:result);
[yield] let dynamic #t10 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("10", <self::Node*>[])), :async_op_then, :async_op_error, :async_op) in null;
self::Node* node = new self::Node::•("1", <self::Node*>[_in::unsafeCast<self::Node*>(:async_temporary_2), _in::unsafeCast<self::Node*>(:async_temporary_0), _in::unsafeCast<self::Node*>(:result)]);
[yield] let dynamic #t10 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("10", core::_GrowableList::•<self::Node*>(0))), :async_op_then, :async_op_error, :async_op) in null;
self::Node* node = new self::Node::•("1", core::_GrowableList::_literal3<self::Node*>(_in::unsafeCast<self::Node*>(:async_temporary_2), _in::unsafeCast<self::Node*>(:async_temporary_0), _in::unsafeCast<self::Node*>(:result)));
core::String* actual = node.{self::Node::toSimpleString}() as{TypeError,ForDynamic} core::String*;
core::print(actual);
if(!actual.{core::String::==}(expected)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ static method others() → dynamic /* originally async */ {
[yield] let dynamic #t19 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
core::num* d = _in::unsafeCast<core::int*>(:async_temporary_1).{core::num::+}(:result as{TypeError,ForDynamic} core::num*);
core::int* cnt = 2;
core::List<core::int*>* b = <core::int*>[1, 2, 3];
core::List<core::int*>* b = core::_GrowableList::_literal3<core::int*>(1, 2, 3);
:async_temporary_3 = b;
:async_temporary_2 = cnt;
[yield] let dynamic #t20 = asy::_awaitHelper(self::dummy(), :async_op_then, :async_op_error, :async_op) in null;
Expand Down Expand Up @@ -354,7 +354,7 @@ static method asserts() → dynamic /* originally async */ {
#L6:
{
{
core::Iterator<core::Function*>* :sync-for-iterator = <core::Function*>[#C1, #C2].{core::Iterable::iterator};
core::Iterator<core::Function*>* :sync-for-iterator = core::_GrowableList::_literal2<core::Function*>(#C1, #C2).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
final core::Function* #t26 = :sync-for-iterator.{core::Iterator::current};
{
Expand Down Expand Up @@ -433,7 +433,7 @@ static method controlFlow() → dynamic /* originally async */ {
#L7:
{
{
core::Iterator<core::Function*>* :sync-for-iterator = <core::Function*>[#C1, #C2].{core::Iterable::iterator};
core::Iterator<core::Function*>* :sync-for-iterator = core::_GrowableList::_literal2<core::Function*>(#C1, #C2).{core::Iterable::iterator};
for (; :sync-for-iterator.{core::Iterator::moveNext}(); ) {
final core::Function* #t33 = :sync-for-iterator.{core::Iterator::current};
{
Expand Down Expand Up @@ -637,7 +637,7 @@ static method controlFlow() → dynamic /* originally async */ {
:controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
return :controller_stream;
}
:async_temporary_0 = <dynamic>[42];
:async_temporary_0 = core::_GrowableList::_literal1<dynamic>(42);
[yield] let dynamic #t55 = asy::_awaitHelper(testStream1.call().{asy::Stream::toList}(), :async_op_then, :async_op_error, :async_op) in null;
self::expectList(_in::unsafeCast<core::List<dynamic>*>(:async_temporary_0), _in::unsafeCast<core::List<core::int*>>(:result));
function testStream2() → asy::Stream<core::int*>* /* originally async* */ {
Expand Down Expand Up @@ -674,7 +674,7 @@ static method controlFlow() → dynamic /* originally async */ {
:controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
return :controller_stream;
}
:async_temporary_1 = <dynamic>[42];
:async_temporary_1 = core::_GrowableList::_literal1<dynamic>(42);
[yield] let dynamic #t57 = asy::_awaitHelper(testStream2.call().{asy::Stream::toList}(), :async_op_then, :async_op_error, :async_op) in null;
self::expectList(_in::unsafeCast<core::List<dynamic>*>(:async_temporary_1), _in::unsafeCast<core::List<core::int*>>(:result));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class C extends core::Object {
try {
#L1:
{
final core::List<core::int*>* #t1 = <core::int*>[];
final core::List<core::int*>* #t1 = core::_GrowableList::•<core::int*>(0);
[yield] let dynamic #t2 = asy::_awaitHelper(this.{self::C::_m}(), :async_op_then, :async_op_error, :async_op) in null;
#t1.{core::List::add}(_in::unsafeCast<core::int*>(:result));
:return_value = block {} =>#t1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import self as self;
import "dart:core" as core;

static method test() → void {
core::List<dynamic>* l = <dynamic>[1, "hello"];
core::List<dynamic>* l = core::_GrowableList::_literal2<dynamic>(1, "hello");
core::List<core::String*>* l2 = l.{core::Iterable::map}<core::String*>((dynamic element) → core::String* => element.{core::Object::toString}()).{core::Iterable::toList}();
}
static method main() → void {}
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ static method f1() → asy::Future<core::List<core::Object*>*>* /* originally as
try {
#L1:
{
:return_value = <core::Object*>[1];
:return_value = core::_GrowableList::_literal1<core::Object*>(1);
break #L1;
}
asy::_completeOnAsyncReturn(:async_future, :return_value, :is_sync);
Expand All @@ -68,7 +68,7 @@ static method f1() → asy::Future<core::List<core::Object*>*>* /* originally as
return :async_future;
}
static method f2() → core::List<core::Object*>*
return <core::Object*>[2];
return core::_GrowableList::_literal1<core::Object*>(2);
static method f3() → asy::Future<core::Object*>* /* originally async */ {
final asy::_Future<core::Object*>* :async_future = new asy::_Future::•<core::Object*>();
core::bool* :is_sync = false;
Expand Down
Loading

0 comments on commit 9d1a307

Please sign in to comment.