Commit Graph

58 Commits

Author SHA1 Message Date
Alexander Markov c3b5939965 [vm] Remove --limit-ints-to-64-bits option and old _Bigint class
Closes https://github.com/dart-lang/sdk/issues/33306

Change-Id: I7088d8b7143edbe24f5cefe4be037ad2006e0625
Reviewed-on: https://dart-review.googlesource.com/58101
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
2018-06-04 20:10:40 +00:00
Samir Jindel 3d2b66074c Reland "[vm] Support definition of entry-points via @pragma('vm.extern') annotations.""
When the constant transformation is enabled on annotations, we need to fix handling
of @ExternalName annotations in the kernel_loader to ensure that we are setting
is_external = false on native methods.

The original revision is in patchset 1.

# Test Plan

The only regression was on benchmarks, Golem results are pending.

Change-Id: Ib80bb9f532299056e770a3b378cc5ad9ee451f57
Reviewed-on: https://dart-review.googlesource.com/56960
Commit-Queue: Samir Jindel <sjindel@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
2018-05-30 20:06:40 +00:00
Alexander Markov 1ca17b6d03 [vm/kernel] Recognize desugared mixin applications in dart:mirrors
Kernel mixin transformation desugars mixin applications into normal
classes. Mixed-in type is pulled into interfaces list.
However, dart:mirrors needs to know the original mixed-in type of
a mixin application.

This change solves this problem by propagating a 'isTransformedMixinApplication'
attribute of a class through kernel AST, kernel binary and VM objects
into dart:mirrors implementation.

Fixes: https://github.com/dart-lang/sdk/issues/33240
Change-Id: I98ca69294e1ad445402a5ca91d90c30447aabcb2
Reviewed-on: https://dart-review.googlesource.com/56721
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Siva Annamalai <asiva@google.com>
Reviewed-by: Kevin Millikin <kmillikin@google.com>
2018-05-29 18:12:26 +00:00
Samir Jindel 58dc4e476d Revert "[vm] Support definition of entry-points via @pragma('vm.extern') annotations."
This reverts commit 3e50ea32b5.

Reason for revert: Severe performance regressions on many aot-v2 benchmarks.

Original change's description:
> [vm] Support definition of entry-points via @pragma('vm.extern') annotations.
> 
> The `@pragma` annotations are evaluated by the constants transformation and
> visible to TFA and the precompiler, which match on the "options" field of the
> annotation to determine whether to mark the class/procedure as a root.
> 
> This required enabling the transformation of annotation constants by default.
> 
> # Test Plan
> 
> The "vmservice_io.main" entry-point is removed from `main.cc` and annotated with
> `@pragma`. All precompiler tests will crash if "vmservice_io.main" is not
> available at runtime.
> 
> Debug/release precompiler bots are visible in "cl-linux" button.
> 
> Change-Id: I03c5d6ba7918672ed9905fcaee8dabe675a93a5d
> Reviewed-on: https://dart-review.googlesource.com/56660
> Commit-Queue: Samir Jindel <sjindel@google.com>
> Reviewed-by: Vyacheslav Egorov <vegorov@google.com>

TBR=vegorov@google.com,alexmarkov@google.com,sjindel@google.com

Change-Id: I779c17d003659129a4b3fcf284423104948f60e2
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://dart-review.googlesource.com/56820
Reviewed-by: Samir Jindel <sjindel@google.com>
Commit-Queue: Samir Jindel <sjindel@google.com>
2018-05-28 19:23:16 +00:00
Samir Jindel 3e50ea32b5 [vm] Support definition of entry-points via @pragma('vm.extern') annotations.
The `@pragma` annotations are evaluated by the constants transformation and
visible to TFA and the precompiler, which match on the "options" field of the
annotation to determine whether to mark the class/procedure as a root.

This required enabling the transformation of annotation constants by default.

# Test Plan

The "vmservice_io.main" entry-point is removed from `main.cc` and annotated with
`@pragma`. All precompiler tests will crash if "vmservice_io.main" is not
available at runtime.

Debug/release precompiler bots are visible in "cl-linux" button.

Change-Id: I03c5d6ba7918672ed9905fcaee8dabe675a93a5d
Reviewed-on: https://dart-review.googlesource.com/56660
Commit-Queue: Samir Jindel <sjindel@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
2018-05-28 15:13:55 +00:00
Alexander Markov 3c6907ed0d [vm/kernel/aot] Approximate numerous invocations per selector in TFA
This change adds tracking of number of invocations with the same
selector but different arguments. If this number reaches certain limit,
all subsequent invocations with such selector are approximated.

On Flutter gallery, 1 selector is approximated:
  dart.core::Object::==

On Analyzer, 2 selectors are approximated:

  analyzer.dart.ast.ast::AstNode::visitChildren
  dart.core::List::[]=

Flutter gallery Total(CodeSize): +11 K.

Fixes https://github.com/dart-lang/sdk/issues/33199

Change-Id: I3598555194262a4f08fe1bc207d10880a25eb432
Reviewed-on: https://dart-review.googlesource.com/56420
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2018-05-24 16:13:22 +00:00
Martin Kustermann bca70073ae [vm/kernel] Move kernel2kenrel "constants" transformation before TFA
Change-Id: Iffa9cea655a0b731c2784a172096d450571eaf1c
Reviewed-on: https://dart-review.googlesource.com/53220
Commit-Queue: Martin Kustermann <kustermann@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
2018-05-24 10:53:42 +00:00
Martin Kustermann 3582e30d8e [VM] Remove unused _Random._A field in Dart sources and make constant in C++ code instead
Issue https://github.com/dart-lang/sdk/issues/33185

Change-Id: I256a66ebf81d4433bded15f19b4147327df9b588
Reviewed-on: https://dart-review.googlesource.com/56329
Commit-Queue: Martin Kustermann <kustermann@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
2018-05-23 13:06:25 +00:00
Martin Kustermann f2b37ab643 [VM] Add support for conditions in switch-case expressions to "constants" transformation
This seems to be the last remaining case which causes constant
evaluation in the VM in AOT mode.

Change-Id: I37dba2c634afa3bebd918ebe6dd93ff52a7708e7
Reviewed-on: https://dart-review.googlesource.com/55163
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Commit-Queue: Martin Kustermann <kustermann@google.com>
2018-05-15 12:52:22 +00:00
Alexander Markov 7e4cec8a49 [vm/kernel/aot] Fix handling of type parameters and annotations on typedefs in TFA tree shaker
Closes https://github.com/dart-lang/sdk/issues/33109

Change-Id: I84204373010ebfdd7d774c8bb29c743d056dc24e
Reviewed-on: https://dart-review.googlesource.com/54981
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2018-05-14 23:04:48 +00:00
Samir Jindel 184e2a8b4c [vm] Support partial instantiation of noSuchMethod forwarders in VM.
This is complicated by the fact that the normal factory method for creating
Invocation objects references the arguments descriptor to determine how many
type arguments are passed. This doesn't work for partially instantiated
closures, because the arguments descriptor will say "0" type arguments even when
there may be delayed type arguments attached to the closure from partial
instantiation. The arguments descriptor can't be modified, so we have a new
factory method which takes the number of delayed type arguments directly.

Change-Id: Ic9a35a482b3b7ef80564e674cc6207873e255111
Reviewed-on: https://dart-review.googlesource.com/54245
Commit-Queue: Samir Jindel <sjindel@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
2018-05-14 14:34:58 +00:00
Jens Johansen 7b3ba3f41f ClassHierarchy refactorings
This CL:
* Removes unused functions in the ClassHierarchy
* Turns the data structures used in the ClassHierarchy upside down
  (nodes have a lists of supers instead of lists of subs)
* Factors some things that needs the original list-of-subs into another
  class that the user can ask the ClassHierarchy to compute if needed.
  It appears that it isn't generally.

This is step #1 in turning the ClassHierarchy into an incremental
ClassHierarchy.

Change-Id: I48c5731c01c1b0e8bf1fcd4ddba7f2bf7ce3b9c9
Reviewed-on: https://dart-review.googlesource.com/53662
Commit-Queue: Jens Johansen <jensj@google.com>
Reviewed-by: Aske Simon Christensen <askesc@google.com>
2018-05-14 11:33:20 +00:00
Alexander Markov 04e9f7da27 [vm/kernel/aot] Fix infinite looping in TFA (ensure convergence of analysis)
Change-Id: If4fe0d6522271880b4bf8d0957ca07ef1f038a90
Reviewed-on: https://dart-review.googlesource.com/53525
Reviewed-by: Zach Anderson <zra@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2018-05-04 17:28:46 +00:00
Martin Kustermann 4697e3c8f6 [vm/kernel] Change "constants" kernel2kernel transformation to be able to recover from errors
Instead of simply throwing an exception when a compile-time error was
discovered during constant evaluation, we report the error and continue
transforming.

This also collects a context, which can be used by error reporters to
show users in which context an error occured.

The reason for using an interface for reporting errors is to be able to
report reasonable nice error messages, keep the transformation inside
package:kernel and allow users of the transformation to possibly report
nicer error message, e.g. by adding quotes of source positions (which
will come in another CL). This makes it slightly verbose.

Change-Id: I965cafc690dddb525b20368d03bb978e18a6ee58
Reviewed-on: https://dart-review.googlesource.com/52447
Commit-Queue: Martin Kustermann <kustermann@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
2018-04-30 11:27:55 +00:00
Samir Jindel 8aa36b75c5 Re-land "[vm/kernel] Fix non-canoncialized type arguments in partial instantiation."
Original revision is in Patchset 1.

Run against failing kernel-precomp tests in "cl-linux-try".

Change-Id: I997de294150ef7dd0874eeccb8b6187ae64ea813
Reviewed-on: https://dart-review.googlesource.com/51220
Reviewed-by: Erik Corry <erikcorry@google.com>
2018-04-18 13:44:25 +00:00
Martin Kustermann b52931ff30 Revert "[vm/kernel] Fix non-canoncialized type arguments in partial instantiation."
This reverts commit bd12c869ae.

Reason for revert: Made many dartkp builders result in crashes.

Change-Id: I908f3929bf3a0227fcc3979b8ba134b1904c8e1c
Reviewed-on: https://dart-review.googlesource.com/51140
Reviewed-by: Régis Crelier <regis@google.com>
2018-04-13 16:39:20 +00:00
Samir Jindel bd12c869ae [vm/kernel] Fix non-canoncialized type arguments in partial instantiation.
Also lay the foundation for partial instantiation of regular closures.

Change-Id: If1c0afd9291d2f9202d8287ebc3ec563679eb06f
Reviewed-on: https://dart-review.googlesource.com/50182
Reviewed-by: Régis Crelier <regis@google.com>
2018-04-13 13:24:17 +00:00
Alexander Markov 17fc446579 [vm/kernel/aot] Fix handling of calls via fields/getters in TFA
Bug: https://github.com/flutter/flutter/issues/16182
Change-Id: Ib2021212fd2dde8b549ca5db9b23287276dc33c9
Reviewed-on: https://dart-review.googlesource.com/50840
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
2018-04-12 16:48:39 +00:00
Kevin Millikin 74cf86cbbb Remove Kernel's DispatchCategory
It complicates the intermediate language, none of the back ends are
using it, and it's not something that we want transformation writers
and code generators to deal with.

Change-Id: Ic79f7935dd8619bd233346bb25947e864f38a104
Reviewed-on: https://dart-review.googlesource.com/50440
Commit-Queue: Kevin Millikin <kmillikin@google.com>
Reviewed-by: Samir Jindel <sjindel@google.com>
2018-04-11 07:43:41 +00:00
Alexander Markov 83f5b1f740 [vm/kernel/aot] Infer types of bool expressions in TFA
This CL enables type inference for bool expressions used in 'if',
'while', 'for', 'assert', '?:', '&&', '||' and '!' in TFA in order to
eliminate more bool checks.

AOT snapshot size of flutter_gallery (in release mode):

Before:
Instructions(CodeSize): 7297024
Total(CodeSize): 11833828

After:
Instructions(CodeSize): 7159120
Total(CodeSize): 11648470

Issue: https://github.com/dart-lang/sdk/issues/32718
Change-Id: If4212ec493ff9f4443be6da02bdd75f74c8c8c42
Reviewed-on: https://dart-review.googlesource.com/49823
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Zach Anderson <zra@google.com>
2018-04-05 23:19:03 +00:00
Alexander Markov 7b51acd37f [vm/kernel/aot] Treat 'return;' as 'return null;' in TFA
Change-Id: I8ccc72494fda00bbcc72b538035e9f6ff8cd2d82
Reviewed-on: https://dart-review.googlesource.com/49060
Reviewed-by: Zach Anderson <zra@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2018-04-02 22:00:05 +00:00
Alexander Markov a60b4d6f56 [kernel/vm/aot] De-duplicate identical mixin applications
Closes https://github.com/dart-lang/sdk/issues/32458

Change-Id: I8439541375d806b0c3ebc5bda2d43a0a0f6643e4
Reviewed-on: https://dart-review.googlesource.com/48884
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
2018-03-30 23:38:03 +00:00
Alexander Markov c60199cf86 [vm/kernel/aot] Tree shaking based on results of TFA, take 2.
This is a re-landing of

https://github.com/dart-lang/sdk/commit/06ebf884db61b97a60b1578560678329cd51bf61

after the fix was submitted separately at

https://github.com/dart-lang/sdk/commit/e3b9c2860e46f9d673ffc3129ede2a11c6125d06

Original review: https://dart-review.googlesource.com/c/sdk/+/46942

Issue: https://github.com/dart-lang/sdk/issues/30480
Change-Id: I2d3a10acb9b5af0184b3d1504acb2f4ebebfff8a
Reviewed-on: https://dart-review.googlesource.com/48440
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2018-03-27 23:39:24 +00:00
Alexander Markov e3b9c2860e [vm/kernel/aot] Fix representation of SuperPropertySet in TFA summaries
This CL fixes TFA summary collector to use right-hand side value as the
result of SuperPropertySet expression instead of result of setter invocation.

Change-Id: Ie2388387645eeec95096ab797e2718b7e031131b
Reviewed-on: https://dart-review.googlesource.com/48300
Reviewed-by: Martin Kustermann <kustermann@google.com>
2018-03-26 16:41:25 +00:00
Alexander Markov 7386d7b5ec Revert "[vm/kernel/aot] Tree shaking based on results of TFA"
This reverts commit 06ebf884db.

Reason for revert: buildbot failures.

Change-Id: Ie6b33061cad80ae3b20b773cc435d64a755620fc
Reviewed-on: https://dart-review.googlesource.com/48263
Reviewed-by: Alexander Markov <alexmarkov@google.com>
2018-03-23 22:57:19 +00:00
Alexander Markov 06ebf884db [vm/kernel/aot] Tree shaking based on results of TFA
This CL adds tree shaking transformation into TFA transformer, replacing
simple DropMethodBodiesVisitor. In addition to removing bodies of
unreachable members, tree shaker is able to remove unused classes, typedefs
and member declarations, and replace unreachable calls with 'throw'.

Total(CodeSize) of flutter_gallery in --release mode
before: 11,671,369
after:  11,499,694

https://github.com/dart-lang/sdk/issues/30480

Change-Id: I966cf222eb9725b7a75dd193ac479436b9b9b4c3
Reviewed-on: https://dart-review.googlesource.com/46942
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
2018-03-23 22:21:39 +00:00
Alexander Markov 9a20a001a6 [vm/kernel/aot] Make static non-const fields nullable in TFA
In Dart, if initializer throws an exception, a static non-const field
will have a null value, even if result of initializer is non-nullable.
This CL fixes TFA to make static non-const fields with initializer
nullable in order to correctly handle this case.

Change-Id: Ib451927b3da508c18ea43fcd0533066fb129a45e
Reviewed-on: https://dart-review.googlesource.com/46577
Reviewed-by: Zach Anderson <zra@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2018-03-16 17:15:47 +00:00
Peter von der Ahé 4f2bdff90b Rename Program to Component
Change-Id: I1a3cc03fba9783807fa637a9d42fdbad68ee7686
Reviewed-on: https://dart-review.googlesource.com/31040
Commit-Queue: Peter von der Ahé <ahe@google.com>
Reviewed-by: Kevin Millikin <kmillikin@google.com>
2018-03-15 12:22:23 +00:00
Kevin Millikin 1abf929476 Fix some uses of deprecated API
Fix all deprecation warnings in the kernel and vm packages.

Change-Id: I44e5b128cc8fbc1360ad4c49ecdf2aa7cfd269d8
Reviewed-on: https://dart-review.googlesource.com/46720
Reviewed-by: Lasse R.H. Nielsen <lrn@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Kevin Millikin <kmillikin@google.com>
2018-03-15 10:09:23 +00:00
Alexander Markov 4b8a604705 [vm/kernel/aot] Support new kernel AST node AssertBlock in TFA
This CL adds support for new kernel AST node AssertBlock (introduced in
https://github.com/dart-lang/sdk/commit/65b19ffa3cac1be00cdab797af864be994c705dc)
to type flow analysis.

Change-Id: I86c2243665c7c429ee5d2fab74f20a0a266d1439
Reviewed-on: https://dart-review.googlesource.com/46601
Reviewed-by: Kevin Millikin <kmillikin@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2018-03-14 22:36:20 +00:00
Alexander Markov 211bf1ee5f [vm/kernel/aot] Cache specializations of cone types in TFA
This speeds up TFA on Flutter gallery:
Analysis time before change: 10131ms
Analysis time after change:   8041ms

Change-Id: I370cc3f1fefc87e5efc311b390e9a6a07dae4497
Reviewed-on: https://dart-review.googlesource.com/45360
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2018-03-07 22:03:52 +00:00
Alexander Markov 1c8841e52a [vm/kernel/aot] Fully support named parameters in type flow analysis
This CL adds all necessary support for analyzing types of named
parameters.

Also, optional positional parameters are analyzed more precisely:
default value is taken into account only if there is a call which omits
parameter.

Issue: https://github.com/dart-lang/sdk/issues/30480
Change-Id: I33ee68cfc736afb65ce561361975d67153af04a3
Reviewed-on: https://dart-review.googlesource.com/44883
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2018-03-07 21:33:42 +00:00
Martin Kustermann 9104b5d387 [VM] Eliminate more type checks when not needed
Clear out generic-covariant-{impl,interface} on parameters which are
statically checked on call site.  If all call sites are this-dispatches then
we are guaranteed to not need the checks.

Issue https://github.com/dart-lang/sdk/issues/31798

Change-Id: I5452a1c9eb3c3e36c1dfc978327bfdcb256cc003
Reviewed-on: https://dart-review.googlesource.com/43421
Commit-Queue: Martin Kustermann <kustermann@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
2018-03-01 14:31:38 +00:00
Alexander Markov a681867054 [vm/kernel/aot] Prepare to enable type flow analysis in Flutter
* Introduce --tfa option in gen_kernel and 'useGlobalTypeFlowAnalysis'
  parameter in compileToKernel(), which is used in Flutter's frontend
  server.

* Split entry_points_extra.json into 2 parts: common to all embedders
  and specific to a standalone VM (entry_points_extra_standalone.json).

* Extract generation of entry points JSON files into a separate .gni
  file, introduce action to generate entry points JSON using
  gen_snapshot instead of dart_bootstrap (required for Flutter), and
  action to copy checked-in extra entry points file.

Issue: https://github.com/dart-lang/sdk/issues/30480
Change-Id: Ie0af9d7128d7fc0e3a9d623fd3c1589e87c83f5c
Reviewed-on: https://dart-review.googlesource.com/43884
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Zach Anderson <zra@google.com>
2018-02-27 19:59:19 +00:00
Alexander Markov 111ea256ad [vm/kernel/aot] Generate list of precompiler entry points during build
This CL adds auto-generation of entry points JSON file for standalone VM
during build (in runtime_kernel target, as it is only used for
kernel-based transformation).

pkg/vm/tool/precompiler2 script is changed to automatically pass
auto-generated entry points to gen_kernel.

New option --entry-points is added to pkg/vm/bin/gen_kernel.dart in order to
specify custom entry points files.

Checked-in entry_points.json is still used for testing and in gen_kernel
if --entry-points is not specified.

Issue: https://github.com/dart-lang/sdk/issues/30480
Change-Id: I39c4461e48763f40d7565656dc33e23fc5d9c2cb
Reviewed-on: https://dart-review.googlesource.com/42521
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Zach Anderson <zra@google.com>
2018-02-23 18:30:46 +00:00
Alexander Markov 3b005afc1c [kernel/vm/aot/tfa] Treat incoming arguments as dynamic in opaque calls
This CL changes incoming argument types of raw (opaque, untracked) calls
in type flow analysis (TFA) from static parameter types to 'dynamic'.
Currently, raw calls are used to approximate calls from native code to
entry points and calls through tear-offs. Using static parameter types
is not correct for raw calls as incoming argument types should not include
the effect of strong mode argument type checks inside the body of a
method. This change has almost no impact on the results of analysis
because intersection with static parameter types is already performed when
applying a summary.

To fill out the remaining gap, static types of fields are now taken
into account in TFA: type of an incoming value is intersected with a static
field type in _FieldValue.setValue().

Also, this CL includes a fix for handling cyclic type parameters in TFA
(this problem appears on language_2/cyclic_type_variable_test test as
soon as TFA starts looking at static types of fields).

Issue: https://github.com/dart-lang/sdk/issues/30480
Change-Id: Ib79f1399e6c086445a61acc22a24a5e37bf481e6
Reviewed-on: https://dart-review.googlesource.com/42820
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
2018-02-23 01:23:42 +00:00
Alexander Markov 2dedc4f9bd [vm/kernel/aot] Add unreachable metadata to members and call sites
This CL adds metadata to mark unreachable (unused) members (both
functions and fields) and unreachable calls into kernel binaries
using the information inferred by global type flow analysis.

Issue: https://github.com/dart-lang/sdk/issues/30480
Change-Id: I86c75cd4c7798a23f1de52141d0e9d605b62bf19
Reviewed-on: https://dart-review.googlesource.com/42462
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2018-02-22 22:44:31 +00:00
Alexander Markov f69cf3b3dc [vm/kernel/aot] Improve efficiency of set operations in TFA
This CL revises implementation of concrete types and set types in
global type flow analysis. For concrete types, unique comparable
class identifiers are assigned. SetType, instead of storing elements
in a Set, stores them in a List ordered by class identifiers.
This makes comparison, union and intersection of set types linear of
number of elements.

Issue: https://github.com/dart-lang/sdk/issues/30480
Change-Id: I85a2aa7e550fd5708352bdca515bf5cb5dc221d1
Reviewed-on: https://dart-review.googlesource.com/42120
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2018-02-22 22:24:01 +00:00
Vyacheslav Egorov d869604387 [vm/kernel/aot] Rename Selector.get/set into Selector.doGet/doSet.
This is a workaround for issue #32196 which breaks Flutter engine
build when frontend_server tries to train by parsing itself.

Change-Id: I5c0d505f41ad5417bcc6a0f66663f28fed192e35
Reviewed-on: https://dart-review.googlesource.com/41983
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Vyacheslav Egorov <vegorov@google.com>
2018-02-16 14:51:17 +00:00
Vyacheslav Egorov 286b123d35 [vm/kernel/aot] Remove type checks from non-dynamically-invoked implicit setters
This applies optimization from d117760 to implicit setters.

(This CL also reformats kernel_binary_flowgraph.cc because some previous CL
was pushed without proper formatting)

Bug: https://github.com/dart-lang/sdk/issues/31798
Change-Id: I6f1590bfd40e36b972b857c49d6ce8435bb25187
Reviewed-on: https://dart-review.googlesource.com/41300
Commit-Queue: Vyacheslav Egorov <vegorov@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2018-02-14 16:24:03 +00:00
Alexander Markov 396ba9b2d2 [vm/kernel/aot] Correctly handle FutureOr in type flow analysis
This CL adds special case for FutureOr<T> type (which is a union
of Future<T> and T) into type flow analysis.
As type flow analysis doesn't retain information about generic type
arguments yet, FutureOr<T> is treated as AnyType for now.

Issue: https://github.com/dart-lang/sdk/issues/30480
Change-Id: Ieb4d862b5a993fe46c9662d9bcb0e1f06058a166
Reviewed-on: https://dart-review.googlesource.com/40463
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
2018-02-13 19:24:44 +00:00
Alexander Markov 6ed2ebf6b0 [vm/kernel/aot] Infer parameter types in type flow analysis
Issue: https://github.com/dart-lang/sdk/issues/30480
Change-Id: Iea1480ce2f20b6cb08b4eb57eef5ca14a002e6e0
Reviewed-on: https://dart-review.googlesource.com/40400
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
2018-02-13 01:11:18 +00:00
Alexander Markov 32396138ff [CFE, VM] Improve efficiency of CHA-based devirtualization
Implemented more efficient way to iterate ClassSet in class_hierarchy.dart,
ClassSet becomes Iterable<Class>. This considerably improves speed of
ClosedWorldClassHierarchy.getSingleTargetForInterfaceInvocation() and
CHA-based devirtualization.

Time of CHA-based devirtualization on Flutter Gallery reduced
from ~13.4s to ~1.2s.

Also, ClassHierarchy used in devirtualization is configured to ignore
ambiguous supertypes to avoid crashes on Flutter Gallery.

Change-Id: Iaca251ca268aad3d8bb652247650096f19c25839
Reviewed-on: https://dart-review.googlesource.com/38960
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
2018-02-07 18:32:39 +00:00
Vyacheslav Egorov d117760ba6 [vm/kernel/aot] Skip unnecessary type checks on parameters of instance methods.
This relands 75a9579ea0.

The approach works as follows:

Step 1: Kernel transform. Under the closed world assumption compute the
set of selectors dispatched dynamically, then mark all procedures that don't
match any of those selectors as 'not-dispatched-dynamically'.

Step 2: VM backend. When building IR for a function if this function was
marked as not-dispatched-dynamically then omit type checks for any parameter
that is not marked as generic-covariant-impl, as such arguments are guaranteed
to be checked on the caller side (by front-end).


+------------------------+------------+----------+-----------+--------------+
|       benchmark        |  baseline  |  current |  with opt |  improved by |
+------------------------+------------+----------+-----------+--------------+
| stock_layout_iteration |  2366.3786 |   2724.3 |   2562.75 |  -5.93%      |
| stock_build_iteration  |     3824.3 |   4914.8 |      4681 |  -4.76%      |
+------------------------+------------+----------+-----------+--------------+

* Flutter gallery Instructions size is reduced by 11% (8748720 bytes to 7846368 bytes).
Baseline is at 6196496 bytes.


Alternatively to annotating individual procedures, I considered annotating Program node
with a set of dynamically dispatched selectors. Decoding and passing this information
around proved to be quite cumbersome in the "streaming" world, so I opted for a simpler
approach where all individual procedures are annotated.

Bug: https://github.com/dart-lang/sdk/issues/3179
Change-Id: I2f32a609e3872c74d5ae7bbd97555453aaedf15f
Reviewed-on: https://dart-review.googlesource.com/38125
Commit-Queue: Samir Jindel <sjindel@google.com>
Reviewed-by: Samir Jindel <sjindel@google.com>
2018-02-02 11:43:55 +00:00
Vyacheslav Egorov 7078f6be58 Revert "[vm/kernel/aot] Skip unnecessary type checks on parameters of instance methods."
This reverts commit 75a9579ea0.

Reason for revert: function_subtype_bound_closure7_test fails in darkp

Original change's description:
> [vm/kernel/aot] Skip unnecessary type checks on parameters of instance methods.
> 
> The approach works as follows:
> 
> Step 1: Kernel transform. Under the closed world assumption compute the
> set of selectors dispatched dynamically, then mark all procedures that don't
> match any of those selectors as 'not-dispatched-dynamically'.
> 
> Step 2: VM backend. When building IR for a function if this function was
> marked as not-dispatched-dynamically then omit type checks for any parameter
> that is not marked as generic-covariant-impl, as such arguments are guaranteed
> to be checked on the caller side (by front-end).
> 
> # Performance Impact
> 
> +------------------------+------------+----------+-----------+--------------+
> |       benchmark        |  baseline  |  current |  with opt |  improved by |
> +------------------------+------------+----------+-----------+--------------+
> | stock_layout_iteration |  2366.3786 |   2724.3 |   2562.75 |  -5.93%      |
> | stock_build_iteration  |     3824.3 |   4914.8 |      4681 |  -4.76%      |
> +------------------------+------------+----------+-----------+--------------+
> 
> * Flutter gallery Instructions size is reduced by 11% (8748720 bytes to 7846368 bytes).
> Baseline is at 6196496 bytes.
> 
> # Alternative Implementations
> 
> Alternatively to annotating individual procedures, I considered annotating Program node
> with a set of dynamically dispatched selectors. Decoding and passing this information
> around proved to be quite cumbersome in the "streaming" world, so I opted for a simpler
> approach where all individual procedures are annotated.
> 
> Change-Id: I363db6d5dd1138fe25917646313c16d0b213c3b4
> Reviewed-on: https://dart-review.googlesource.com/37822
> Commit-Queue: Vyacheslav Egorov <vegorov@google.com>
> Reviewed-by: Alexander Markov <alexmarkov@google.com>
> Reviewed-by: Samir Jindel <sjindel@google.com>

TBR=vegorov@google.com,alexmarkov@google.com,sjindel@google.com

Change-Id: I0fd6bf3e6edfc3e605da2b996f9a0da6c409d01c
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://dart-review.googlesource.com/37802
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
2018-02-01 20:41:19 +00:00
Vyacheslav Egorov 75a9579ea0 [vm/kernel/aot] Skip unnecessary type checks on parameters of instance methods.
The approach works as follows:

Step 1: Kernel transform. Under the closed world assumption compute the
set of selectors dispatched dynamically, then mark all procedures that don't
match any of those selectors as 'not-dispatched-dynamically'.

Step 2: VM backend. When building IR for a function if this function was
marked as not-dispatched-dynamically then omit type checks for any parameter
that is not marked as generic-covariant-impl, as such arguments are guaranteed
to be checked on the caller side (by front-end).

# Performance Impact

+------------------------+------------+----------+-----------+--------------+
|       benchmark        |  baseline  |  current |  with opt |  improved by |
+------------------------+------------+----------+-----------+--------------+
| stock_layout_iteration |  2366.3786 |   2724.3 |   2562.75 |  -5.93%      |
| stock_build_iteration  |     3824.3 |   4914.8 |      4681 |  -4.76%      |
+------------------------+------------+----------+-----------+--------------+

* Flutter gallery Instructions size is reduced by 11% (8748720 bytes to 7846368 bytes).
Baseline is at 6196496 bytes.

# Alternative Implementations

Alternatively to annotating individual procedures, I considered annotating Program node
with a set of dynamically dispatched selectors. Decoding and passing this information
around proved to be quite cumbersome in the "streaming" world, so I opted for a simpler
approach where all individual procedures are annotated.

Change-Id: I363db6d5dd1138fe25917646313c16d0b213c3b4
Reviewed-on: https://dart-review.googlesource.com/37822
Commit-Queue: Vyacheslav Egorov <vegorov@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Samir Jindel <sjindel@google.com>
2018-02-01 18:07:38 +00:00
Alexander Markov d69ac00676 [vm/kernel/tfa] Remove unused static type approximations
This CL removes .staticType from all Types and most Statements as they
are not currently used.

Change-Id: Ia29bac49327356b26395c4851d84941daf61614d
Reviewed-on: https://dart-review.googlesource.com/37124
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2018-01-31 19:15:15 +00:00
Alexander Markov 2b8e149999 [vm/kernel/tfa] Improve efficiency of type flow analysis
* _ReceiverTypeBuilder class is introduced to create receiver type more
  efficiently (without using union operations and creating intermediate
  types).

* Certain tracing prints are hidden behind kPrintTrace flag to avoid
  expensive string interpolations.

* Also, added debugging flag for dumping class hierarchy.

This CL reduces analysis time of Flutter gallery by ~2x.

Change-Id: Ia918b88a4d902895e77aac306dc6a5cf9cecad14
Reviewed-on: https://dart-review.googlesource.com/37644
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2018-01-31 17:43:25 +00:00
Alexander Markov 30a12f927b [vm/kernel/tfa] Fix invalidation of invocations during processing
This CL fixes the case when an invocation is invalidated in the
middle of processing. In such case, its result should not be retained
and it should be re-processed again.

Also:

* _WorkList.pending Set is replaced with LinkedList (reduces analysis time).

* ClassHierarchy is configured to ignore ambiguous supertypes.

* _AssertionError._throwNew entry point is added (as it is implicitly
  inserted by flow graph builder).

Change-Id: Ie2d5d29352a5463fbe602910f9ae7f6f77a917d7
Reviewed-on: https://dart-review.googlesource.com/37126
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
2018-01-30 17:32:19 +00:00
Alexander Markov be767fc855 [vm/kernel] Support noSuchMethod in type flow analysis
Issue: https://github.com/dart-lang/sdk/issues/30480
Change-Id: I65bc3af0745107a401d473f267789de4b27bf191
Reviewed-on: https://dart-review.googlesource.com/36361
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2018-01-29 17:47:03 +00:00