Commit Graph

130 Commits

Author SHA1 Message Date
Vyacheslav Egorov 16e4f2f1c2 Revert "Revert "Revert "Recognize and optimize a.runtimeType == b.runtimeType pattern."""
This reverts commit e495e100dd.

Commit breaks bots that are using Android devices (SIMARM is unaffected).

R=rmacnak@google.com
BUG=

Review URL: https://codereview.chromium.org/2449013004 .
2016-10-26 16:53:32 +02:00
Vyacheslav Egorov e495e100dd Revert "Revert "Recognize and optimize a.runtimeType == b.runtimeType pattern.""
This reverts commit 890f694de5.

Previous commit was passing field_type_map_ down in a place where it was not passed down before.

This caused some handles to be used across zones, which caused crashes.

BUG=

Review URL: https://codereview.chromium.org/2453463006 .
2016-10-26 12:25:48 +02:00
Ryan Macnak 890f694de5 Revert "Recognize and optimize a.runtimeType == b.runtimeType pattern."
This reverts commit f4ec20abac.

Revert "Use ZoneHandle when creating ConstantInstr"

This reverts commit cb87f2d82f.

This change introduced crashes on AOT and runtime errors on the GN SDK build.

TBR=vegorov@google.com

Review URL: https://codereview.chromium.org/2451893002 .
2016-10-25 13:19:33 -07:00
Vyacheslav Egorov f4ec20abac Recognize and optimize a.runtimeType == b.runtimeType pattern.
Start by removing all get:runtimeType overrides in the patch files to have a single point computing the runtime type - Object.get:runtimeType. Handle string, double and integer types inside both intrinsic and runtime call to unify their handling and guarantee that code works even with intrinsifier disabled.

With overrides removed we can easily check that get:runtimeType is unique function name within the application that is being precompiled and use that to convert InstanceCall(get:runtimeType, ...) into StaticCall even nothing is known about the receiver.

This enables us to check if both left side and right side of comparison are StaticCall(Object.get:runtimeType, ...) when specializing InstanceCall(==, x, y). If they are we convert InstanceCall(==, StaticCall(get:runtimeType, a), StaticCall(get:runtimeType, b)) into StaticCall(Object._hasSameRuntimeType, a, b). A canonicalization rule will later delete unused get:runtimeType invocations.

Object._hasSameRuntimeType is implemented in C++ and intrinsified. It operates without creating new runtime types (except for Closures - where it does for simplicity). Cases of different class ids (i.e. a.[cid] != b.[cid]) and non-parameterized types are handled completely in the intrinsic. The rest is handled in the runtime code.

Microbenchmarking results:

Same parameterized classes: 15x improvement
Different parameterized classes: 300x improvement
Different/same non-parameterized classes: 2x improvement

BUG=
R=fschneider@google.com, regis@google.com

Review URL: https://codereview.chromium.org/2379733002 .
2016-10-25 10:03:06 +02:00
Ryan Macnak 21a6f50892 Tearing off a top-level variable introduces a synthetic field which is added to the top-level class not but the library.
R=hausner@google.com

Review URL: https://codereview.chromium.org/2428353004 .
2016-10-19 15:34:25 -07:00
Regis Crelier 0ac91fab5c Minor cleanup: use handle when setting instructions in code object.
R=rmacnak@google.com

Review URL: https://codereview.chromium.org/2416963009 .
2016-10-14 16:06:59 -07:00
Florian Schneider e25461c151 VM Propagate receiver type from calls to unique selectors in AOT compilation.
If there is no override of noSuchMethod in any class, we can
propagate the receiver type downwards from calls that call a unique
selector.

This speeds up dart2js by around 3%, a particle simulation benchmark by around 10%.

BUG=
R=rmacnak@google.com

Review URL: https://codereview.chromium.org/2412653002 .
2016-10-11 13:17:47 -07:00
Ryan Macnak 2bc6e0a71d AOT: Add a separate switchable call state for unlinked calls.
Flutter gallery
Isolate(CodeSize): 2213525 =>
Isolate(CodeSize): 2070395 (-6.4%)

R=fschneider@google.com

Review URL: https://codereview.chromium.org/2357313003 .
2016-09-26 10:34:36 -07:00
Siva Annamalai 12f86594ec Add --parse-all option in order to benchmark and measure the scanner/parser performance.
R=hausner@google.com

Review URL: https://codereview.chromium.org/2327693002 .
2016-09-23 15:20:39 -07:00
Matthias Hausner 3e0d13bc28 Make compile-time errors catchable
If an error happens during the compilation of a function body, an Error is thrown which can be intercepted, and ensures that finally blocks are executed before the isolate is terminated.

The language spec is vague about compilation errors. A doc describing the intentions behind this CL is at
https://docs.google.com/document/d/1_MWOgwJadLCQSBps0zD6Rj5dG4iP1UBuiDvTMH-WMzI/edit#

Example:
     1	void bad() {
     2	    return 5
     3	}
     4
     5	void main(args) {
     6	    bad();
     7	}

Before this CL:
$ dart ~/tmp/e.dart
'file:///Users/hausner/tmp/e.dart': error: line 2 pos 11: semicolon expected
  return 5
          ^
$

After this change:
$ dart ~/tmp/e.dart
Unhandled exception:
'file:///Users/hausner/tmp/e.dart': error: line 2 pos 11: semicolon expected
  return 5
          ^

#0      main (file:///Users/hausner/tmp/e.dart:6:3)
#1      _startIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:259)
#2      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:148)
$

Notice that the stack trace points to the call site of bad(), not the text location of the syntax error. That's not a bug. The location of the syntax error is given in the error message.

BUG= https://github.com/dart-lang/sdk/issues/23684
R=asiva@google.com, lrn@google.com

Review URL: https://codereview.chromium.org/2044753002 .
2016-09-16 10:10:38 -07:00
Ryan Macnak 47cc06ae66 Shrink AOT snapshot size and memory usage.
- Conditionally remove fields of Code, Function and ICData that are not used in the AOT runtime.
 - Don't include RawClosureData.context_scope_ in AOT snapshots.
 - Remove parameter names not needed for method resolution.
 - Remove parameter types not needed for function type tests.
 - Deduplicate parameter name and parameter type lists.
 - Shrink and share the initial MegamorphicCache table.

Flutter gallery (IsolateSnapshotReader event)
snapshot size 2731129 -> 2199999 (-19.4%)
initial heap  7899568 -> 5433176 (-31.2%)

R=fschneider@google.com

Review URL: https://codereview.chromium.org/2326483005 .
2016-09-15 15:06:42 -07:00
Ryan Macnak 6137d020b9 AOT: Use a cid range check when possible to implement type tests.
R=fschneider@google.com

Review URL: https://codereview.chromium.org/2314133003 .
2016-09-08 15:25:08 -07:00
Florian Schneider a80ea01c8c Fix VM product build (linker error)
TBR=rmacnak@google.com,

Review URL: https://codereview.chromium.org/2317883002 .
2016-09-06 15:16:37 -07:00
Florian Schneider c9e1c3dd05 VM: Compute static guarded cid for final instance fields.
Before the tree-shaking pass, iterate over final field initializers
and try to compute the static type.

R=rmacnak@google.com

Review URL: https://codereview.chromium.org/2300873002 .
2016-09-06 14:59:53 -07:00
Ryan Macnak 6a5a868a4e AOT: Reassign class ids so class hierarchies have contiguous ranges.
R=fschneider@google.com

Review URL: https://codereview.chromium.org/2281263002 .
2016-08-26 16:17:05 -07:00
Ryan Macnak e40b4fd2c5 Update some switchable call stub names and comments.
R=fschneider@google.com

Review URL: https://codereview.chromium.org/2272793004 .
2016-08-23 17:27:57 -07:00
Florian Schneider 8eaa762d4a VM: Remove more duplicate code between AOT and JIT compiler.
BUG=
R=rmacnak@google.com

Review URL: https://codereview.chromium.org/2265873005 .
2016-08-22 15:20:54 -07:00
Ryan Macnak 366e5b3310 AOT: Optimize even large functions. Ensures all calls are optimized static calls, switchable calls or megamorphic calls.
Clear IC entries before snapshot to remove the need to relink at startup.

R=fschneider@google.com

Review URL: https://codereview.chromium.org/2246083003 .
2016-08-15 16:49:43 -07:00
Ryan Macnak 7ff2dd4117 Optimize AOT's switchable calls for the monomorphic case.
The call sequence is very similar to a classic IC call, except the guarded class and the target are loaded indirectly from the constant pool instead of as immediates. In the monomorphic case, we call directly to the expected target with a class check in the callee. In the unlinked, polymorphic and megamorphic cases, we call a stub; these case are now call-through instead of call-and-return.

Every code, except stubs involved in switchable calls, includes the class check sequence at the beginning. So we now distinguish between a checked and an unchecked entry point. Generated code except the switchable call continues to use the unchecked entry point.

PC offsets are calculated relative to the beginning of the instruction stream, rather than either entry point.

BUG=
R=fschneider@google.com

Review URL: https://codereview.chromium.org/2226893002 .
2016-08-12 11:18:35 -07:00
Ryan Macnak 87360dc375 Revert asserting only 1 arg ICs are generated in precompilation.
Review URL: https://codereview.chromium.org/2244743002 .
2016-08-12 10:09:02 -07:00
Ryan Macnak acf68a7126 Don't mark closurized natives as natives.
We used to implement implicit closures by duplicating the body, but now they perform a call to the parent function.

R=fschneider@google.com

Review URL: https://codereview.chromium.org/2237113003 .
2016-08-11 16:05:54 -07:00
Ryan Macnak 978abe4e32 Tree-shaker: Use insertion in the work queue instead of "was compiled" as the criterion to retain a function.
Don't AddTypesOf(function) before the work queue is empty, or we may miss types in exception handlers that are not computed until the function is compiled.

R=fschneider@google.com

Review URL: https://codereview.chromium.org/2209893003 .
2016-08-03 16:57:55 -07:00
Ryan Macnak 8c87121afe Revert "Tree-shaker: Use insertion in the work queue instead of "was compiled" as the criterion to retain a function."
This reverts commit 908309fe6d.

Review URL: https://codereview.chromium.org/2199263004 .
2016-08-03 09:34:10 -07:00
Ryan Macnak 908309fe6d Tree-shaker: Use insertion in the work queue instead of "was compiled" as the criterion to retain a function.
Allows dropping const constructors never used as non-const constructors nor roots.

R=fschneider@google.com

Review URL: https://codereview.chromium.org/2203843003 .
2016-08-02 16:30:57 -07:00
Florian Schneider 08a96e13b7 AOT: Faster invocation of callback fields.
In the JIT we dynamically create stubs for implicit closure invocation of fields.

For AOT we only used to do this for the .call invocations (explicit closure calls).
Other fields invocations would go through the slower runtime call.

This CL adds invocation stubs in AOT mode for all fields that have a function type
as type annotation (likely callback fields) and avoid the overhead of runtime calls.

The invocation stubs are cached at receiver classes. Therefore, they are added to
all subclasses of a class that defines a callback field.

This speeds up Flutter's layout_bench on a Nexus 4 by 6.8%.

R=rmacnak@google.com

Review URL: https://codereview.chromium.org/2202773002 .
2016-08-01 17:16:55 -07:00
Ryan Macnak db48637ab3 Clear token streams before compacting the symbol table.
Also fixes size regression introduced by 83da4db9f9.

BUG=http://dartbug.com/26916
R=fschneider@google.com

Review URL: https://codereview.chromium.org/2167683004 .
2016-07-20 12:48:27 -07:00
Florian Schneider d3810213b0 VM: Array bounds checks that don't deoptimize for precompiled code.
1. Make CheckArrayBoundInstr also check the index for smi. This allows easy replacement
of the deoptimizing checks with the slow-path checks in the precompiler.

2. Add GenericCheckBoundInstr which has a slow-path attached for
handling check failures.

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

Review URL: https://codereview.chromium.org/2149023002 .

Committed: https://github.com/dart-lang/sdk/commit/4a5f651c4b2202013ab7c3db887fd95e2597e173
2016-07-15 10:07:41 -07:00
Ryan Macnak 2a535414bc Revert "VM: Array bounds checks that don't deoptimize for precompiled code."
This reverts commit 4a5f651c4b.

Review URL: https://codereview.chromium.org/2152683003 .
2016-07-14 13:28:23 -07:00
Florian Schneider 4a5f651c4b VM: Array bounds checks that don't deoptimize for precompiled code.
1. Make CheckArrayBoundInstr also check the index for smi. This allows easy replacement
of the deoptimizing checks with the slow-path checks in the precompiler.

2. Add GenericCheckBoundInstr which has a slow-path attached for
handling check failures.

BUG=
R=vegorov@google.com

Review URL: https://codereview.chromium.org/2149023002 .
2016-07-14 10:48:50 -07:00
Ryan Macnak 8951c33878 Fix clearing compile time constant caches during tree shaking.
The old code was rendered ineffective by the move from per-isolate to per-script caches.

R=fschneider@google.com

Review URL: https://codereview.chromium.org/2141263003 .
2016-07-13 11:06:41 -07:00
Ryan Macnak ee942bd8d6 Remove per-isolate compile-time constants cache.
There are no scripts in the VM isolate as of 83da4db9f9.

R=asiva@google.com

Review URL: https://codereview.chromium.org/2147493005 .
2016-07-12 17:35:54 -07:00
Todd Turnidge 62ccff992f Cache compile-time constants on the script object, sometimes.
When a script is not in the vm heap, we now cache compile time
constants on the script object itself.  During isolate reload we may
have both an old and a new version of a script being compiled at the
same time and they need to cache their constants separately.  This
also means that compile time constants from old scripts can be
collected when the script is collected, which is good.

When a script is in the vm heap, we continue to use the old system of
employing a shared per-isolate cache stored in the object store.

Closes #26833

BUG=
R=fschneider@google.com, johnmccutchan@google.com

Review URL: https://codereview.chromium.org/2126393003 .
2016-07-11 14:15:37 -07:00
Florian Schneider 22828c58cb Improve inlining of recognized methods in AOT.
Also, assert that we don't repeatedly perform speculative inlining.

BUG=
R=vegorov@google.com

Review URL: https://codereview.chromium.org/2097413002 .
2016-06-27 08:55:02 -07:00
Ryan Macnak 8f342605f3 Last reference to a library may be through a top-level type.
BUG=http://dartbug.com/26733
R=fschneider@google.com

Review URL: https://codereview.chromium.org/2100533002 .
2016-06-24 17:59:31 -07:00
Zachary Anderson e933f28a18 Remove some uses of STL map.
This CL removes the use of STL map from freelist.cc by adding
MallocDirectChainedHashMap in hash_map.h and adding an iterator for
BaseDirectChainedHashMap there.

It also removes a use of STL map from hash_table.h that was dead code.

R=johnmccutchan@google.com

Review URL: https://codereview.chromium.org/2083103002 .
2016-06-22 08:32:37 -07:00
John McCutchan bf4b3b3733 Activate the service isolate for all precompiled tests.
- [x] We always need the load port now.
- [x] Fix a minor locking issue in Loader::~Loader

BUG=
R=rmacnak@google.com

Review URL: https://codereview.chromium.org/2041113003 .
2016-06-07 12:47:44 -07:00
Ryan Macnak 6b6d363900 Add missing tree shaking root for draining the microtask queue after running a service extension.
R=asiva@google.com

Review URL: https://codereview.chromium.org/2033983002 .
2016-06-02 17:21:41 -07:00
Ryan Macnak 3f8c0bb0a9 Don't overload FreeListElement for become.
R=asiva@google.com, johnmccutchan@google.com

Review URL: https://codereview.chromium.org/2026643004 .
2016-06-02 10:57:34 -07:00
Florian Schneider 3344a6f6f4 Avoid leaking objects that should be collected after tree-shaking.
Added handle scopes to ensure that no objects leak through handles
to after tree-shaking where we expect no instances of dropped classes
being around.

BUG=dartbug.com/26515
R=rmacnak@google.com

Review URL: https://codereview.chromium.org/2009513002 .
2016-05-25 16:15:38 +02:00
Ryan Macnak 38ad3dd923 Don't write Code::code_source_map_ in snapshots.
Fix precompilation in product mode by adding the object store clearing need to make the entry point removals from 39a1a30415 safe.

Saves ~30k from precompiled dart2js x64 product.

R=fschneider@google.com

Review URL: https://codereview.chromium.org/1997143002 .
2016-05-23 09:24:35 -07:00
Siva Annamalai 5de775a823 - Canonicalize generic types in a global isolate hash
table, this ensures that we do not linearly walk through
  a large type list in the class calling the expensive
  'Type::Equals' method (some applications have close to
  1304 generic types in them)

- Use the stand hash table implementation for TypeArguments
  canonicalization instead of a custom hash table

R=johnmccutchan@google.com, regis@google.com, rmacnak@google.com

Review URL: https://codereview.chromium.org/1965493004 .
2016-05-17 14:35:23 -07:00
Ryan Macnak 37d08d6ebc Add timeline events for compiling static initializers and writing full snapshots. Remove timeline event for InitCompiler. Fail gracefully for missing flags when writing full snapshots.
Also fix PRODUCT build.

R=johnmccutchan@google.com

Review URL: https://codereview.chromium.org/1970363002 .
2016-05-16 09:28:49 -07:00
Florian Schneider f0a4c40709 VM precompiler: Compute and use result type of static initializers of final fields.
Perform a preprocessing pass to record
the result type of static initializers of static final fields.

The following round of precompilation benefits from result types for all loads from final
static fields.

BUG=
R=vegorov@google.com

Review URL: https://codereview.chromium.org/1973553003 .
2016-05-13 15:43:38 +02:00
Florian Schneider 39a1a30415 VM: Another fix for precompiling with >1 iterations.
Corrected VM entry points.

Fixed collection of unique function names.

Removed wrong assertion.

Clean up unused code.

BUG=
R=rmacnak@google.com

Review URL: https://codereview.chromium.org/1969843002 .
2016-05-12 09:32:31 +02:00
Florian Schneider fca36e299d VM: Fix precompiler running with multiple iterations.
Static initializers were accidentally skipped when doing >1 rounds
of precompilation.

BUG=
R=rmacnak@google.com

Review URL: https://codereview.chromium.org/1968593003 .
2016-05-10 21:51:32 +02:00
Florian Schneider 140458b982 VM: Add flag to specify number of precompiler iterations.
This makes it easier to experiments with doing multiple rounds
of precompilation.

BUG=
R=rmacnak@google.com

Review URL: https://codereview.chromium.org/1970473002 .
2016-05-10 21:25:22 +02:00
Ryan Macnak 1e8fdaee68 Support for taking full snapshots from 'dart', not just 'dart_bootstrap'.
- Don't create rival copies of the predefined symbols in isolates in dart_bootstrap.
 - Don't do work to save these rival copies during symbol table compaction.
 - Create unified symbol table just before writing the vm isolate.
 - Create unified list of scripts to include in the vm isolate.
 - Ignore object ids of the old vm isolate when writing a new one.
 - Ensure token stream private keys are hashed.
 - Use the type of isolate we are writing instead of an object's current isolate to decide if vm isolate objects are written symbolically.

BUG=
R=asiva@google.com

Review URL: https://codereview.chromium.org/1944213002 .
2016-05-10 10:13:33 -07:00
Florian Schneider 245197fb9f VM precompiler: Allow optimizing static initializers.
Static initializers were compiled without any optimizations. They are only
executed once, but the optimizer can potentially extract static type information
and may also produce a bit smaller code. (7K size savings when compiling dart2js -- i.e. < 0.1%)

This CL enables optimizations for them. The space savings
 are not great, but I still think it's nicer to only have
 optimized code when precompiling, instead of a mixture of
 unoptimized and optimized.

Also, fix printing disassembly for initializers, and insert additional assertions.

BUG=
R=rmacnak@google.com

Review URL: https://codereview.chromium.org/1958913003 .
2016-05-10 09:38:03 +02:00
Siva Annamalai 29d79258f1 Fix precompile build issue with IsString change.
R=rmacnak@google.com

Review URL: https://codereview.chromium.org/1953803003 .
2016-05-05 12:53:02 -07:00
Ivan Posva b2ac279269 - Use a map to lookup libraries by URL.
- Ensure the uniqueness of private keys without having to
  search the existing key space.
- Pass a thread parameter where useful to library methods.

BUG=

Review URL: https://codereview.chromium.org/1947393003 .
2016-05-05 10:42:28 -07:00