Commit Graph

2008 Commits

Author SHA1 Message Date
Erik Corry 029b1cb948 Spelling fixes e to i.
R=kevmoo@google.com
BUG=

Review-Url: https://codereview.chromium.org/2957593002 .
2017-06-24 13:41:39 +02:00
Régis Crelier bb527cb89e Avoid an assert fault in snapshot writer by making sure that the parent of a
signature function is also a signature function (fixes #29994).

R=rmacnak@google.com

Review-Url: https://codereview.chromium.org/2949383003 .
2017-06-23 14:18:12 -07:00
Zachary Anderson ac16656161 Remove MIPS support
R=asiva@google.com

Review-Url: https://codereview.chromium.org/2858623002 .
2017-06-22 08:49:22 -07:00
Erik Corry 8378b8fdbf VM: Reland Inline instance object hash code into object header on 64bit.
Inline instance object hash code into object header on 64 bit.

64 bit objects have 32 bits of free space in the header word.
This is used for the hash code in string objects. We take it
for the default hash code on all objects that don't override
the hashCode getter.

This is both faster and a memory reduction. Eg it makes the
MegaHashCode part of the Megamorphic benchmark 6 times faster.

This is a reland of https://codereview.chromium.org/2912863006/
It fixes issues with the 32 bit compare-swap instruction on
ARM64 and fixes a fragile tree shaking test that is sensitive
to which private methods are in the core libraries.

R=kustermann@google.com, vegorov@google.com
BUG=

Review-Url: https://codereview.chromium.org/2954453002 .
2017-06-22 14:56:24 +02:00
Aske Simon Christensen cec963f028 The current growth strategy for growable arrays allocates a backing array of size 2 at (empty) creation and doubles the size whenever the capacity is insufficient while adding elements.
I collected statistics for the sizes and capacities of growable arrays which are promoted to old-space or survive an old-space gc when running dart2js and Fasta. For these applications, the vast majority of arrays stay empty. More than half of the total object size of promoted backing arrays is backing for empty growable arrays.

Furthermore, since the overhead for an array is 3 words (header, type parameters and length), and object sizes are rounded up to an even number of words, we waste one word for all even-sized arrays.

This CL changes the growth strategy so that empty growable arrays are created with a shared, zero-sized array as backing, avoiding the allocation of a backing array if no elements are added. When the array needs to grow, it starts out at 3 and grows to double size plus one each time: 7, 15, 31, ...

A few places in the VM code need to handle these shared, zero-sized arrays specially. In particular, the Array::MakeArray function needs to allocate a new, empty array if its result is to be returned to Dart code.

Benchmarks suggest that the change improves memory usage by a few percent overall and does not significantly affect run time.

BUG=
R=erikcorry@google.com

Review-Url: https://codereview.chromium.org/2949803002 .
2017-06-22 10:51:54 +02:00
Erik Corry 847cd093ba Revert "Inline instance object hash code into object header on 64 bit."
This reverts commit ac6310d5f3 because
of test failures on real ARM64 hardware as opposed to the DartVM
simulator.  Original review: https://codereview.chromium.org/2912863006/

R=kustermann@google.com
BUG=

Review-Url: https://codereview.chromium.org/2953753002 .
2017-06-22 10:22:48 +02:00
Erik Corry ac6310d5f3 Inline instance object hash code into object header on 64 bit.
64 bit objects have 32 bits of free space in the header word.
This is used for the hash code in string objects. We take it
for the default hash code on all objects that don't override
the hashCode getter.

This is both faster and a memory reduction.  Eg it shaves about
70% off the running time of this microbenchmark:

List list = [];

class Thing {
  get hashCode => 42;
}

class Thing2 {
  get hashCode => 42;
}

class Thing3 { }
class Thing4 { }

main() {
  int sum = 103;
  for (int i = 0; i < 10000000; i++) {
    list = [];
    list.add("foo");
    list.add(123);
    list.add(1.23);
    list.add(new Object());
    list.add(new Thing());
    list.add(new Thing2());
    list.add(new Thing3());
    list.add(new Thing4());
    for (int j = 0; j < 2; j++) {
      sum ^= biz(list);
    }
  }
  print(sum);
}

int biz(List list) {
  int sum = 103;
  for (var x in list) {
    sum ^= x.hashCode;
  }
  return sum;
}

R=rmacnak@google.com, vegorov@google.com
BUG=

Review-Url: https://codereview.chromium.org/2912863006 .
2017-06-22 09:25:52 +02:00
Régis Crelier 1f5f3ed79f Set and keep parent function of signature functions.
Fix function type parameter comparison in type tests.

R=rmacnak@google.com

Review-Url: https://codereview.chromium.org/2951803005 .
2017-06-21 13:16:23 -07:00
Ryan Macnak dddd96cfd2 [arm] Avoid unaligned access fault in Int32x4/Float32x4::value().
R=zra@google.com

Review-Url: https://codereview.chromium.org/2947783002 .
2017-06-21 09:11:04 -07:00
Régis Crelier a62107cfaf Check for a passed-in type argument vector in the prolog of generic functions.
Do this in unoptimized code only, when --reify-generic-functions is specified.
This is still work in progress, and support in optimizer, in inliner, in DBC,
in kernel to ir, and other areas, will follow.
Many small fixes and added todos.

R=rmacnak@google.com, vegorov@google.com

Review-Url: https://codereview.chromium.org/2941643002 .
2017-06-21 09:02:16 -07:00
Siva Annamalai 8b7af73daa 1. Dynamically compute the main closure that needs to be run by the main isolate
2. Get rid of _getMainClosure()
3. Adjust the AOT compiler to ensure it retains the function associated with
   the main closure without having to include '_getMainClosure()' in the list
   of embedder specified entry points
4. Get rid of the hack in kernel reader to do a delayed patch of
   '_getMainClosure()' in the builtin library.

BUG=
R=aam@google.com, rmacnak@google.com

Review-Url: https://codereview.chromium.org/2933603002 .
2017-06-15 10:40:45 -07:00
Jens Johansen 4bbda48a7c [kernel] Stream everything. Replace .kernel_function with .kernel_offset
- Put pointer to kernel data into Script.
- Replace function.kernel_function pointer to AstNode with
  kernel_offset():
- Replace field.kernel_field pointer to AstNode with kernel_offest().
- Stream the previously unstreamed AstNodes: FunctionDeclaration and
  FunctionExpression.
- Move special handling for _buildin.getMainClosure into the streaming
  flowgraph builder.
- Delete big parts of kernel_to_il.

R=kmillikin@google.com

Committed: https://github.com/dart-lang/sdk/commit/948e2f5d7916032ed6f0bfdc316ba4f577a5ea61
Review-Url: https://codereview.chromium.org/2901533002 .
2017-06-14 10:59:57 +02:00
Jens Johansen de5ebc5a4e Revert "[kernel] Stream everything. Replace .kernel_function with .kernel_offset"
The commit somehow made e.g. vm-linux-release-ia32-be turn red.

This reverts commit 948e2f5d79.

BUG=

Review-Url: https://codereview.chromium.org/2941483003 .
2017-06-14 09:12:38 +02:00
Jens Johansen 948e2f5d79 [kernel] Stream everything. Replace .kernel_function with .kernel_offset
- Put pointer to kernel data into Script.
- Replace function.kernel_function pointer to AstNode with
  kernel_offset():
- Replace field.kernel_field pointer to AstNode with kernel_offest().
- Stream the previously unstreamed AstNodes: FunctionDeclaration and
  FunctionExpression.
- Move special handling for _buildin.getMainClosure into the streaming
  flowgraph builder.
- Delete big parts of kernel_to_il.

R=kmillikin@google.com

Review-Url: https://codereview.chromium.org/2901533002 .
2017-06-14 08:27:21 +02:00
Ryan Macnak 74f3d1bd9c Add Dart_Save/LoadCompilationTrace.
R=zra@google.com

Review-Url: https://codereview.chromium.org/2922913004 .
2017-06-05 16:56:21 -07:00
Erik Corry aa60a2ea90 More compact string representation on 64 bit.
This moves the hash code into the header word for strings on 64 bit
platforms.  With the old layout, 9 character strings became 48-byte
objects.  With the new layout you have to go to 17 characters before
you are bumped from 4 to 6 words (32 to 48 bytes).

As a side effect, the class ID field is now 16 bits on all platforms
instead of having two different sizes, and the size field is 8 bits
on all platforms.

This also paves the way for moving the hash code for instance objects
into the header, so we won't need the side-lookup in the
hash-table-of-hash-codes on 64 bit platforms.

This is a reapplication of https://codereview.chromium.org/2893553002/
after issues were fixed in https://codereview.chromium.org/2888413002/
and https://codereview.chromium.org/2896583002/

R=vegorov@google.com
BUG=

Review-Url: https://codereview.chromium.org/2895183002 .
2017-05-22 10:04:59 +02:00
Régis Crelier 9aafded095 Pass type argument vector to generic functions (if --reify-generic-functions is
true, still false per default).
Work in progress, not functional yet (passed vector is still ignored in callee).

R=vegorov@google.com, zra@google.com

Review-Url: https://codereview.chromium.org/2859673002 .
2017-05-18 14:03:47 -07:00
Dmitry Stefantsov e5f93a068f Revert "More compact string representation on 64 bit."
This reverts commit 5c8e472c82.

TBR=erikcorry@google.com

Review-Url: https://codereview.chromium.org/2889723005 .
2017-05-18 14:23:12 +02:00
Erik Corry 5c8e472c82 More compact string representation on 64 bit.
This moves the hash code into the header word for strings on 64 bit
platforms.  With the old layout, 9 character strings became 48-byte
objects.  With the new layout you have to go to 17 characters before
you are bumped from 4 to 6 words (32 to 48 bytes).

As a side effect, the class ID field is now 16 bits on all platforms
instead of having two different sizes, and the size field is 8 bits
on all platforms.

This also paves the way for moving the hash code for instance objects
into the header, so we won't need the side-lookup in the
hash-table-of-hash-codes on 64 bit platforms.

R=vegorov@google.com
BUG=

Review-Url: https://codereview.chromium.org/2893553002 .
2017-05-18 11:54:40 +02:00
Kevin Millikin 514281b8a7 Move the Kernel canonical name table into the VM's heap
The canonical name table is copied into a typed data array in the VM's
heap.  The encoding is the same as in the binary except that the
integer indexes are fixed-size.

Canonical names are now integer indexes instead of objects allocated
in the C++ heap.

BUG=
R=jensj@google.com, vegorov@google.com

Review-Url: https://codereview.chromium.org/2853423002 .
2017-05-03 19:27:11 +02:00
Kevin Millikin 865e0669b2 Move the Kernel string offsets into the VM's heap.
Copy the Kernel string offsets into a uint32 array in the VM's heap.
This avoids allocating small string objects with new and avoids having
a table of the canonical strings.

Instead of an offset and a size, strings are now represented as
indexes into the string table in the heap.  The start offset of string
N is found at byte offset N*4 because it is a uint32, and the end
offset is found at byte offset (N+1)*4.  The strings themselves are
just integer indexes instead of pointers.

In the stream flow graph builder, string access is all random access.

R=jensj@google.com, vegorov@google.com

Review-Url: https://codereview.chromium.org/2852943003 .
2017-05-02 17:35:55 +02:00
Erik Corry aa6353b6da Dart SDK Spelling b, c, and d.
R=kmillikin@google.com
BUG=

Review-Url: https://codereview.chromium.org/2850783002 .
2017-05-01 08:28:10 +02:00
Erik Corry eeea4fd331 Reland "Use off-heap data for type feedback in PolymorphicInstanceCallInstr"
This is a reapplication of https://codereview.chromium.org/2809583002/
with a fix for the AOT case.

We have been using IC data for receiver type info in the
PolymorphicInstanceCallInstr. This is a data structure optimized for
access from hand-coded assembly stubs, and placed on the GC-ed heap,
which means it has to be accessed through handles. With this change we
move it to the zone memory, which means it can be freed without an
old-gen GC.  As a side-effect the zone arrays use exponential growth for
amortized constant space allocation instead of growing by 1 for
quadratic allocation when we add classes, further reducing memory
pressure.

R=vegorov@google.com
BUG=

Review-Url: https://codereview.chromium.org/2842753002 .
2017-04-25 15:27:18 +02:00
Erik Corry e753278c5f Revert "Reland "Use off-heap data for type feedback in PolymorphicInstanceCallInstr""
This reverts commit 694ddfcdd3.
Original code review: https://codereview.chromium.org/2809583002/
Reverted because of failures on Android:
python tools/test.py -mrelease -cprecompiler -rdart_precompiled -aarm
-sandroid --use-blobs -t480
language/vm/canonicalization_preserves_deopt_test

R=vegorov@google.com
BUG=

Review-Url: https://codereview.chromium.org/2836043002 .
2017-04-24 17:04:28 +02:00
Erik Corry 694ddfcdd3 Reland "Use off-heap data for type feedback in PolymorphicInstanceCallInstr"
This reverts commit 2135c8a90f.
This is a reland of https://codereview.chromium.org/2809583002/

Original text:
We have been using IC data for receiver type info in the
PolymorphicInstanceCallInstr. This is a data structure optimized for access
from hand-coded assembly stubs, and placed on the GC-ed heap, which means it
has to be accessed through handles. With this change we move it to the zone
memory, which means it can be freed without an old-gen GC.  As a side-effect
the zone arrays use exponential growth for amortized constant space allocation
instead of growing by 1 for quadratic allocation when we add classes, further
reducing memory pressure.

R=vegorov@google.com
BUG=

Review-Url: https://codereview.chromium.org/2833333003 .
2017-04-24 15:39:07 +02:00
Erik Corry 2135c8a90f Revert "Use off-heap data for type feedback in PolymorphicInstanceCallInstr"
This reverts commit d315a53e21.

SIMDBC debug mode failures.
Revert of https://codereview.chromium.org/2809583002/

R=lrn@google.com
BUG=

Review-Url: https://codereview.chromium.org/2833413002 .
2017-04-24 13:56:32 +02:00
Erik Corry d315a53e21 Use off-heap data for type feedback in PolymorphicInstanceCallInstr
We have been using IC data for receiver type info in the PolymorphicInstanceCallInstr. This is a data structure optimized for access from hand-coded assembly stubs, and placed on the GC-ed heap, which means it has to be accessed through handles. With this change we move it to the zone memory, which means it can be freed without an old-gen GC.  As a side-effect the zone arrays use exponential growth for amortized constant space allocation instead of growing by 1 for quadratic allocation when we add classes, further reducing memory pressure.

R=vegorov@google.com
BUG=29302

Review-Url: https://codereview.chromium.org/2809583002 .
2017-04-24 11:15:28 +02:00
Régis Crelier 3f6d4ec1eb Use trail in type tests involving the call function (fixes #29405).
Add regression test.

R=asiva@google.com

Review-Url: https://codereview.chromium.org/2831073004 .
2017-04-21 09:14:24 -07:00
Erik Corry 4b9bba55b4 Stoppp using trippple consonants
R=ahe@google.com
BUG=

Review-Url: https://codereview.chromium.org/2833073002 .
2017-04-21 17:50:13 +02:00
Kevin Millikin 2e794c4e16 Move Kernel strings into the VM's heap.
- Instead of a pointer to new'd memory, Kernel strings now have an
  offset from the start of the string data.

- When the streaming reader encounters the string data it records the
  offset from the start of the binary.  This offset is stored in the
  Kernel Program and is used to compute the offset for strings.

- When a KernelReader is constructed, the string data is copied into a
  Uint8 array in the VM's heap.

- A pointer to the string data is put into every Kernel script so it
  can be used for constructing VM strings at compile time.

The source table does not use Kernel strings any more because those
strings are not found in the raw string data.  Instead, the source
table uses new'd buffers for strings (but this will be cleaned up
separately).

R=jensj@google.com

Review-Url: https://codereview.chromium.org/2820363002 .
2017-04-21 10:32:48 +02:00
Régis Crelier 1b68c0d0a1 Process generic function type arguments in more places (function type tests,
function cloning for mixins, signature building, etc...).
Rename --generic-method-semantics flag to --reify-generic-functions (still not
working and disabled by default).

R=asiva@google.com

Review-Url: https://codereview.chromium.org/2835513002 .
2017-04-20 14:20:18 -07:00
Ryan Macnak c4983a541e Trace signature types in the tree shaker.
R=regis@google.com

Review-Url: https://codereview.chromium.org/2829933002 .
2017-04-20 10:44:30 -07:00
Régis Crelier f0622c0567 Allow signature functions to be allocated in new space.
Types generated via instantiation during run time type tests are allocated in
new space and it makes sense (in the case of function types) to also allocate
instantiated signatures in new space.

R=asiva@google.com

Review-Url: https://codereview.chromium.org/2821233005 .
2017-04-19 10:10:44 -07:00
Ryan Macnak 17e43f284b Tree shaker:
- Don't remove entries from a library's dictionary while iterating over it.
 - Remove library prefixes from library dictionaries.
 - Compact library dictionaries after removing entries.
 - Track snapshot references in debug mode and give a backtrace when unencountering an unexpected object.
 - Verify removed libraries are not included in the snapshot by marking their top-level classes.

R=asiva@google.com

Review-Url: https://codereview.chromium.org/2823873003 .
2017-04-19 10:03:43 -07:00
Erik Corry 0856863355 Fall back to megamorphic stub when dispatching calls to rare classes.
Previously we were converting very polymorphic calls that always end up
in the same implementation into a check-class instruction and a (usually
inlined) direct call.  This works well in artificial benchmarks like
the Megamorphic suite, but tends to cause repeated deopts on large real
programs like dart2js, where new classes arrive after a while, triggering
the check-class instruction to deopt.  After a few deopts, the function
is no longer eligible for optimization, resulting in huge slowdowns.

Instead with this change we can switch to the normal machinery for polymorphic
calls with more than one target.  This has the advantage that we use a
megamorphic stub call to catch rare classes, rather than deopting.
Dart2js is speeded up by a few percent on average and avoids the big
performance potholes described in https://github.com/dart-lang/sdk/issues/29302

Also reverts a less effective workaround for 29302.

R=vegorov@google.com
BUG=29302

Review-Url: https://codereview.chromium.org/2829603002 .
2017-04-19 15:25:24 +02:00
Régis Crelier 4dd686e9df More work on finalization of recursive types (fixes #29357).
Add regression test.

R=rmacnak@google.com

Review-Url: https://codereview.chromium.org/2822323002 .
2017-04-18 17:18:39 -07:00
Siva Annamalai 96bbe512eb Fix for issue 29350 - VM Crashes when covariant is used incorrectly.
BUG=#29350
R=rmacnak@google.com

Review-Url: https://codereview.chromium.org/2827453003 .
2017-04-18 11:10:28 -07:00
Ryan Macnak 29de769d98 Allow the resolved names cache to be lazily created like the exported names cache.
R=regis@google.com

Review-Url: https://codereview.chromium.org/2823633003 .
2017-04-17 10:07:27 -07:00
Régis Crelier fd5089c9e8 Remove parent_level field of function type parameters.
Add function_type_arguments field in closure instances.
Lots of other smaller changes, also related to generic function semantics.
This is still work in progress, with a change of direction in the design:
The type argument vector of a generic function will be prepended with the type
arguments of enclosing generic functions. The re-allocation and concatenation
will be done in nested generic function's prolog. This will greatly simplify
instantiation of types at run time without having to search the context for
parent function's type arguments. However, a closure instance now requires an
additional field. On the other hand, type parameters do not require a
parent_level field anymore.

R=rmacnak@google.com

Review-Url: https://codereview.chromium.org/2818273002 .
2017-04-17 08:58:24 -07:00
Ryan Macnak 5cffc591aa Refactor AOT deduplication steps so they can run before an app-jit snapshot as well.
Additionally dedup PcDescriptors, deopt entries, deopt lists, and await token position lists.

R=asiva@google.com

Review-Url: https://codereview.chromium.org/2815533003 .
2017-04-12 14:23:49 -07:00
Regis Crelier d0a7bad121 Pass a second type argument vector to all type instantiation calls in the VM.
With generic methods, uninstantiated types will require 2 instantiators, one
reflecting the class type arguments (as of today) and one reflecting the
function type arguments (new).
This is work in progress and the second instantiator is always null for now.

R=asiva@google.com

Review-Url: https://codereview.chromium.org/2799373002 .
2017-04-10 21:25:33 -07:00
Regis Crelier 5f5a698100 Keep types in signatures of function types properly instantiated as the function
type itself gets instantiated.
Until now, the signature was kept unchanged and the instantiation was reflected
by the type arguments of the function type only. This delayed instantiation
would complicate the implementation of generic functions.
This cl actually removes type arguments for (non-typedef) function types. The
function type is now fully represented by the signature. When the function type
is instantiated, a new signature is allocated (instead of a new type argument
vector) to hold instantiated result type and formal parameter types.
The same applies in the case of typedef function types, however, the type
arguments of the typedef are kept as before. This allows for better printing
of typedef function types and for finalization of recursive type involving
typedefs as type arguments.

R=asiva@google.com

Review-Url: https://codereview.chromium.org/2793033005 .
2017-04-06 12:28:52 -07:00
Ryan Macnak cbb8519a69 Do not embed is_auto_setup_scope into the compilation of native calls.
Rather, split NativeCallWrapper into variants that do or do not set up an API scope. This makes it safe for lazy link natives to also lazily resolve.

Issue #24686

R=zra@google.com

Review-Url: https://codereview.chromium.org/2793163002 .
2017-04-05 15:30:06 -07:00
Regis Crelier a08c95e003 Rename dart::Genericity::kClass to dart::Genericity::kCurrentClass to avoid
collision with dart::kernel::Tag::kClass.

R=bkonyi@google.com

Review-Url: https://codereview.chromium.org/2796993002 .
2017-04-04 12:08:57 -07:00
Florian Schneider 80b43ff15c Reland "VM: Handle null-comparisons in the flow graph type propagation"
This reverts commit ee452a8600.

Original CL: https://codereview.chromium.org/2772143002/

Additional bug fix: Correctly replace ToCid with ToNullableCid in
RedefinitionInstr::ComputeType.

R=rmacnak@google.com

Review-Url: https://codereview.chromium.org/2789943002 .
2017-03-31 15:39:01 -07:00
Ryan Macnak a2c41bd926 Move the canonical empty context to the VM isolate.
R=fschneider@google.com

Review-Url: https://codereview.chromium.org/2780393005 .
2017-03-31 14:43:01 -07:00
Florian Schneider ee452a8600 Revert "Reland "VM: Handle null-comparisons in the flow graph type propagation""
This reverts commit e7afde47e9.

This was because of analyzer test failures (out of memory in the background compiler)

TBR=rmacnak@google.com

Review-Url: https://codereview.chromium.org/2794583002 .
2017-03-31 10:53:56 -07:00
Florian Schneider e7afde47e9 Reland "VM: Handle null-comparisons in the flow graph type propagation"
This reverts commit 30a942f728.

Plus:

1. Fixes integer type propagation in the optimizer by introducing a _int64 marker interface

2. Fixes calculation of whether an instructions can deoptimize: This has to be stable so that
once determined that an instructions can't deoptimize, it will stay that way and not flip back
later in the optimization

3. Address comments to improve CompileType::CopyNonNullable()

R=vegorov@google.com

Review-Url: https://codereview.chromium.org/2772143002 .
2017-03-31 10:12:59 -07:00
Erik Corry 48607be33d Improve internal compiler API so that OSR code is never installed on function.
This is forked off and a prerequisite for
https://codereview.chromium.org/2771013002/ which is itself a prerequisite for
a change to make fewer old-space allocations in the optimizing compiler, which
is in turn a fix for the performance regression in
https://codereview.chromium.org/2737303003

Fixes dart-lang/sdk#29160

R=vegorov@google.com
BUG=http://dartbug.com/29160

Review-Url: https://codereview.chromium.org/2781483005 .
2017-03-30 15:40:04 +02:00
Regis Crelier bde22d2dee Cleanup change.
AssertAssignableInstr::Canonicalize was too restrictive: it can instantiate the
type even if the instantiator is null.
Do not allocate empty TypeArguments handles, but use the common one instead.

R=fschneider@google.com

Review-Url: https://codereview.chromium.org/2759393005 .
2017-03-21 13:55:39 -07:00