Commit Graph

972 Commits

Author SHA1 Message Date
Ryan Macnak d1b0713e8b Revert "[vm] MemoryCopy instruction for copying between typed data and strings."
This reverts commit 6ecd8a10ea.

Reason for revert: Breaks ABI

Original change's description:
> [vm] MemoryCopy instruction for copying between typed data and strings.
> 
> Used for copying the bytes from the Uint8List to the _OneByteString in
> String.fromCharCodes and the pure-ASCII case of UTF-8 decoding.
> 
> Issue https://github.com/dart-lang/sdk/issues/42072
> Closes https://github.com/dart-lang/sdk/issues/41703
> 
> Change-Id: I1ae300222877d1c6e64e32c2f40b8fb187a584c0
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/149500
> Commit-Queue: Aske Simon Christensen <askesc@google.com>
> Reviewed-by: Martin Kustermann <kustermann@google.com>

TBR=kustermann@google.com,askesc@google.com

Change-Id: I5fc0b58da80dca23c91b57ec2833492e9d0885a8
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/150802
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
2020-06-10 18:41:55 +00:00
Aske Simon Christensen 6ecd8a10ea [vm] MemoryCopy instruction for copying between typed data and strings.
Used for copying the bytes from the Uint8List to the _OneByteString in
String.fromCharCodes and the pure-ASCII case of UTF-8 decoding.

Issue https://github.com/dart-lang/sdk/issues/42072
Closes https://github.com/dart-lang/sdk/issues/41703

Change-Id: I1ae300222877d1c6e64e32c2f40b8fb187a584c0
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/149500
Commit-Queue: Aske Simon Christensen <askesc@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2020-06-10 14:40:17 +00:00
Aske Simon Christensen cf6f8903a5 [vm] IL instruction for UTF-8 scan.
Speeds up decoding across the board, with medium-length pure ASCII
strings seeing about 2x on X64 and IA32.

Closes https://github.com/dart-lang/sdk/issues/41702

Change-Id: I1c8e0bc69baaaeb6755d4c775e6fa0e6d18e1c57
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/148762
Commit-Queue: Aske Simon Christensen <askesc@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2020-06-08 15:03:34 +00:00
Régis Crelier c48263e901 Revert "[VM/nnbd] Canonicalize TypeParameter objects in the VM."
This reverts commit 6a98e2719e.

Reason for revert: Unexpected test failures

Original change's description:
> [VM/nnbd] Canonicalize TypeParameter objects in the VM.
> 
> Prior to this CL, type parameters were all assumed canonical, even duplicate ones.
> 
> Per a new convention introduced in this CL, the type parameter array in generic classes and generic functions contains canonical type parameters. As these type parameters get cloned with a different nullability, they are inserted in a new hash table of canonical type parameters.
> 
> This fixes performance issue https://github.com/dart-lang/sdk/issues/41421
> 
> Change-Id: I9086158fa6b6261e9997bb50edec6d7c54abbfa1
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/148223
> Commit-Queue: Régis Crelier <regis@google.com>
> Reviewed-by: Ryan Macnak <rmacnak@google.com>

TBR=rmacnak@google.com,alexmarkov@google.com,asiva@google.com,regis@google.com

Change-Id: I0ca3b6b66e2281c285eba6b564f78c0e6b2f2217
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/150265
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Régis Crelier <regis@google.com>
2020-06-05 23:36:45 +00:00
Regis Crelier 6a98e2719e [VM/nnbd] Canonicalize TypeParameter objects in the VM.
Prior to this CL, type parameters were all assumed canonical, even duplicate ones.

Per a new convention introduced in this CL, the type parameter array in generic classes and generic functions contains canonical type parameters. As these type parameters get cloned with a different nullability, they are inserted in a new hash table of canonical type parameters.

This fixes performance issue https://github.com/dart-lang/sdk/issues/41421

Change-Id: I9086158fa6b6261e9997bb50edec6d7c54abbfa1
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/148223
Commit-Queue: Régis Crelier <regis@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
2020-06-05 22:56:50 +00:00
Alexander Markov 1618fd965b [vm/compiler] Optimize lazy field initialization
Load*Field and Init*Field IL instructions are fused into load
instructions with 'calls_initializer' flag.

A new, more powerful elimination of lazy initializer calls uses
data flow analysis and load forwarding (place numbering).

In addition to improved elimination of initializer calls,
fusing instructions avoids extra load after field is already
loaded for lazy initialization check.

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

Change-Id: Ibb2a63f84b9b0c970db67b3d6684ec15384a64e7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/148283
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2020-06-01 21:28:18 +00:00
Alexander Markov f57c99fc31 [vm/compiler] Fix crash in inliner when receiver is dead
Fixes https://github.com/dart-lang/sdk/issues/42065

Change-Id: Ib66163a41a13f02cfa9df9bcb1cf505e934fea93
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/149370
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2020-05-29 16:34:45 +00:00
Aske Simon Christensen bbf34035dd Revert "[vm] Check prefix.loadLibrary is called and returns before prefix members are used."
This reverts commit f049a410e5.

Reason for revert: Broke reload bots.

Original change's description:
> [vm] Check prefix.loadLibrary is called and returns before prefix members are used.
> 
> Not loading is actually deferred.
> 
> Bug: https://github.com/dart-lang/sdk/issues/41974
> Change-Id: I62688007bd36dbcb2e8ffb4a1fd2dceb1775b1c8
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/149053
> Commit-Queue: Ryan Macnak <rmacnak@google.com>
> Reviewed-by: Siva Annamalai <asiva@google.com>

TBR=rmacnak@google.com,alexmarkov@google.com,asiva@google.com

Change-Id: I923e339465fdf13199efc11a9cef4a842abebd67
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: https://github.com/dart-lang/sdk/issues/41974
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/149423
Reviewed-by: Aske Simon Christensen <askesc@google.com>
Commit-Queue: Aske Simon Christensen <askesc@google.com>
2020-05-29 09:04:02 +00:00
Ryan Macnak f049a410e5 [vm] Check prefix.loadLibrary is called and returns before prefix members are used.
Not loading is actually deferred.

Bug: https://github.com/dart-lang/sdk/issues/41974
Change-Id: I62688007bd36dbcb2e8ffb4a1fd2dceb1775b1c8
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/149053
Commit-Queue: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Siva Annamalai <asiva@google.com>
2020-05-28 23:13:12 +00:00
Regis Crelier 19f49509b0 [VM/nnbd] The equivalent of dynamic as bound is Object? and not Object.
This is a partial fix for https://github.com/dart-lang/sdk/issues/41939

Let's take one step at a time, but later, we should be able to leave the bound as dynamic, since mutual subtyping of bounds is now implemented.

Change-Id: I57f725ba5b02237a64ae77593f340438f7159ab7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/148515
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Régis Crelier <regis@google.com>
2020-05-19 18:10:54 +00:00
Tess Strickland 7aae1f6032 [vm] Relax AssertSubtype to allow non-constant sub and super types.
Previously, AssertSubtype instructions could only be created with a
compile-time AbstractType value for sub_type and super_type. Relax this
so that AssertSubtype instructions can be created with possibly
non-constant Values instead.

Currently, all AssertSubtype uses still have constant sub- and
supertypes, so for now we check at code generation that we indeed
have constants for these values and only handle the constant case. Thus,
there should be no impact on size or speed of the generated code from
these changes. Follow-up work will add code generation for non-constant
sub- and supertypes and add uses the generalized form.

Bug: https://github.com/dart-lang/sdk/issues/40813

Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-linux-release-x64-try,vm-kernel-precomp-linux-product-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-release-simarm-try,vm-kernel-precomp-linux-release-simarm_x64-try,vm-kernel-precomp-linux-release-simarm64-try
Change-Id: Ib1512b3e07a016d68a8e0c670ce857b8ac1b2777
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/147520
Commit-Queue: Tess Strickland <sstrickl@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2020-05-15 11:51:32 +00:00
Clement Skau e29407cde2 [VM] Removes parameter type check for sync-yielding function.
Benchmarks:
- RunTime (bigger is better):
  - Iteration.tree.syncstar(ia32): +8%
  - Iteration.concat.syncstar(ia32): +10%
  - Iteration.tree.syncstar(x64): +4%
  - Iteration.concat.syncstar(x64): +5%

Bug: https://github.com/dart-lang/sdk/issues/37753
Change-Id: I9203560b9ceb0f2dcc1583d88ea95b7d88b628d6
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/146780
Commit-Queue: Clement Skau <cskau@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2020-05-14 17:18:56 +00:00
Tess Strickland db51ed7507 [vm] Relax AssertAssignable to allow dst_type to be non-constant.
Previously, AssertAssignable instructions could only be created with a
compile-time AbstractType value for dst_type. Relax this so that
AssertAssignable instructions can be created with a possibly
non-constant Value instead.

This is only an IL-level change for the instruction. Code generation for
AssertAssignable still requires the dst_type Value to be bound to a
constant and is otherwise unchanged from before, thus this should have
no impact on size or speed of generated code. (Generating the
non-constant case will be done in follow-up work.)

Bug: https://github.com/dart-lang/sdk/issues/40813

Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-linux-release-x64-try,vm-kernel-precomp-linux-product-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-release-simarm-try,vm-kernel-precomp-linux-release-simarm_x64-try,vm-kernel-precomp-linux-release-simarm64-try,vm-dartkb-linux-release-simarm64-try,vm-dartkb-linux-release-x64-try
Bug: https://github.com/dart-lang/sdk/issues/40813
Change-Id: I1f984039d8c2695c66161a69a3d80cfbe7110f19
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/146801
Commit-Queue: Tess Strickland <sstrickl@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
2020-05-12 11:22:19 +00:00
Alexander Markov 4029d01d70 [vm/nnbd] NNBD-related fixes for bytecode mode
* AssertAssignable should not be generated for top types according to
  IsTopTypeForSubtyping().

* Arguments descriptor should be passed when calling field initializer
  from InitLateInstanceField/InitLateFinalInstanceField stubs.
  If interpreter is enabled, InterpretCall stub expects to find
  arguments descriptor in a register. Also, lazy compilation stub
  may save arguments descriptor in a slot visited by GC, so arguments
  descriptor register should contain a GC-safe value.

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

Change-Id: Ia33ed1bc57007d674799fb4453c8ab4841037211
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/147383
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2020-05-08 22:10:06 +00:00
Regis Crelier eae248cc41 [VM/compiler] Emit a throw NoSuchMethodError for bad arity rather than aborting compilation.
The bad arity maybe detected after an isolate reload or when using strong mode with a mix of opted in and opted out libraries.
The thrown NoSuchMethodError contains enough information to be useful, but does not mirror the complete invocation (e.g. arguments).

This CL does not fix https://github.com/dart-lang/sdk/issues/37517 where the target is missing after a reload (not just bad arity).

The VM implementation of NoSuchMethodError is cleaned up, but the deprecated constructor 'NoSuchMethodError(...)' is not yet removed, since it is still documented.

Change-Id: I0306971c59cb510d21cb1b1acc3545c8817dfea7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/146986
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Régis Crelier <regis@google.com>
2020-05-08 18:08:26 +00:00
Alexander Markov dd2d040ccb [vm] Cleanup flags which disable argument type checks and strong mode types
The following options are removed:
--use_strong_mode_types
--experimental_unsafe_mode_use_at_your_own_risk

The following flags and predicates are removed:

Dart_IsolateFlags::unsafe_trust_strong_mode_types
Isolate::argument_type_checks()
Isolate::can_use_strong_mode_types()
Isolate::should_emit_strong_mode_checks()

Also, everything depending on these flags is cleaned up.

Change-Id: I9328009ad5a42ea2173842386d612c465e3ebec1
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/147325
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2020-05-08 15:53:09 +00:00
Ryan Macnak 2707880f1b [vm] Fix various UBSan failures.
Bug: https://github.com/dart-lang/sdk/issues/39427
Change-Id: I74e0eee623d88005fb2893d03e284a87daa09260
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/146696
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Ryan Macnak <rmacnak@google.com>
2020-05-07 19:40:18 +00:00
asiva c740bbc161 [VM] Set up Isolate specific null safety mode
- change the null_safety flag to be a tri state flag (unspecified, no
  null safety and null safety)
- added logic to set the null safety mode of an isolate based on the
  value specified in the kernel file (.dill file) if the null safety
  flag is not specified on the command line
- added logic to auto detect the null safety mode based on the language
  version API provided by CFE
- added logic to pass the correct null safety option to CFE when
  invoking it for compilation based on the null-safety flag setting
- Delete non-nullable-flag() function and adjust code that was using it.
- Remove 'nnbd-experiment' from the snapshot string.

https://github.com/dart-lang/sdk/issues/41206
https://github.com/dart-lang/sdk/issues/41207

Change-Id: I006bf3c9229980fc7986faac6a5850d3722aec92
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/143160
Commit-Queue: Siva Annamalai <asiva@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
Reviewed-by: Liam Appelbe <liama@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
2020-05-01 04:03:04 +00:00
Alexander Markov 8d16dbb17f [vm/nnbd] Revise IsTopType* predicates
IsTopTypeForAssignability is renamed to IsTopTypeForSubtyping to better
reflect that it works both for subtyping and assignability.

Most uses of IsTopType() are changed to IsTopTypeForSubtyping().

The remaining uses of IsTopType() are checking for top types in
instance-of ('is') tests, so IsTopType is renamed to IsTopTypeForInstanceOf.

Also, Instance::IsFutureOrInstanceOf is renamed to RuntimeTypeIsSubtypeOfFutureOr
to align it with RuntimeTypeIsSubtypeOf and reflect that it is
calculating subtyping and not instance-of.

Change-Id: Ib8d3574edc1b90d80f5528330bd84b099b37d2b8
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/145446
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
2020-04-30 19:35:32 +00:00
Ryan Macnak 6fe15f6df9 [vm] Represent tagged pointers as C++ value types instead of C++ pointer types.
This works around bugs in UndefinedBehaviorSanitizer and Clang.

Bug: b/28638298
Change-Id: I6be595f9664516019d28017d24559583a1ae3a21
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/144354
Commit-Queue: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
2020-04-25 05:21:27 +00:00
Regis Crelier c99da6857f [VM/nnbd] Field initializers may allocate a context storing 'this' when needed.
This fixes these co19 tests in strong mode:
LanguageFeatures/nnbd/late_A05_t01
LanguageFeatures/nnbd/late_A05_t02

Change-Id: I90e9f91eec120d82992e835f79396c2a7770fcbc
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/144814
Commit-Queue: Régis Crelier <regis@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
2020-04-25 01:12:17 +00:00
Liam Appelbe 216e3df452 [vm] Handle required params in bytecode mode
Change-Id: I9e6b62969012bf2e0d9fce6bfe894a2367f240c3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/138664
Commit-Queue: Liam Appelbe <liama@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
2020-04-24 20:52:27 +00:00
Regis Crelier 157d567358 [VM/nnbd] Eliminate two VM crashes when running strong mode tests.
Using strong mode with a mix of opted in and opted out libraries may result in a static call with bad arguments (missing required named argument) that may crash the VM with an assert fault. Ideally, we should emit code to throw a NoSuchMethodError when the code is executed. For now, we report the error as an informative exception during compilation instead of aborting.

The name of the enclosing function needs to be canonical when creating an instance of _FallThroughError when compiling a switch statement.

Change-Id: I50349fcc5b5036fbdec4697238b1e840de15ec07
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/144498
Commit-Queue: Régis Crelier <regis@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
2020-04-23 19:04:05 +00:00
Alexander Markov 53860a5822 [vm/nnbd] Take Never type out of the VM isolate
Never type in the VM isolate causes bootstrapping problems when
null-safety mode is auto-detected. We cannot initialize its type
testing stub without knowing null-safety mode and we cannot patch it
after figuring out null-safety mode because VM isolate is read-only.

The solution is to move Never type (and Never class) out of the VM
isolate and make them per isolate.

Issue: https://github.com/dart-lang/sdk/issues/41206
Change-Id: Iede937aa5becd5f1f7b029db836c25a1b20fbc5c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/144488
Reviewed-by: Régis Crelier <regis@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2020-04-23 01:31:57 +00:00
Alexander Markov 69791c50f8 [vm/nnbd] Use InitInstanceField instruction for late instance fields
Fixes https://github.com/dart-lang/sdk/issues/41299
Issue https://github.com/dart-lang/sdk/issues/41417

Change-Id: I1219ddaffcf3a2b17226305eeea8455c73f4ca78
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/143189
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2020-04-20 23:30:14 +00:00
Aske Simon Christensen 5b78cb8fb5 [vm/aot] Handle tearoffs in dispatch table.
Adds another interface target to instance calls, pointing to the torn
off method for tearoff getter calls. This is then used to direct the
call to the method extractor for the method.

Increases the fraction of dynamically dispatched instance calls in
Flutter Gallery that are handled by the dispatch table from 95.8% to
98.4%. The remaining 92 IC calls are all on static receiver type
dynamic or Function (34 function calls, 22 method calls, 21 operator
calls, 14 getter calls and 1 setter call).

Change-Id: I0bde1a8271c8563f4631534bd39d1254cd779380
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/142155
Commit-Queue: Aske Simon Christensen <askesc@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2020-04-20 12:42:46 +00:00
Alexander Markov 085e22dd72 [vm/nnbd] Change type of sentinel values to Never
Special sentinel values which are used for lazy initialization can be
stored in variables of any type. In NNBD world Null is no longer a
bottom type as null cannot be assigned into variables of non-nullable
types. The new universal bottom type is Never, so type of sentinel
values is changed from Null to Never.

This also allows to make late fields non-nullable in the type
propagation and avoid extra updates to field guards.

This change also adds special handling of comparisons with sentinel
values into constant propagation as it can constant fold comparisons
of values with different cids.

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

Change-Id: I8266cfba0cc434b78ffa9570c30d434d4380d4af
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/143864
Reviewed-by: Liam Appelbe <liama@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2020-04-17 18:32:28 +00:00
Vyacheslav Egorov beb7114861 [vm/compiler] Add check to prevent inclusion of compiler headers into AOT runtime
This relands commit b0a71d364c

Cq-Include-Trybots: dart/try:vm-kernel-precomp-linux-release-simarm64-try,vm-kernel-precomp-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-linux-release-simarm-try,vm-kernel-precomp-linux-release-x64-try
Change-Id: I1d32e5d0d44f4e422d188643b548ed81859f7d74
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/143807
Commit-Queue: Vyacheslav Egorov <vegorov@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
2020-04-17 13:11:08 +00:00
Alexander Aprelev c7861f309f Revert "[vm/compiler] Add check to prevent inclusion of compiler headers into AOT runtime"
This reverts commit b0a71d364c as it broke precomp builds.

Change-Id: Ieb776739b8d3e9ac74794e05fc20a793625e5f09
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/143865
Commit-Queue: Alexander Aprelev <aam@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
2020-04-16 23:51:09 +00:00
Vyacheslav Egorov b0a71d364c [vm/compiler] Add check to prevent inclusion of compiler headers into AOT runtime
#if defined(DART_PRECOMPILED_RUNTIME)
  #error "AOT runtime should not use compiler sources (including header files)"
  #endif  // defined(DART_PRECOMPILED_RUNTIME)

Remove #if defined(DART_PRECOMPILED_RUNTIME) from most compiler sources.

Change-Id: Id175c83fdbea38d9d5e1371ff433e3888f2afe8a
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/143523
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2020-04-16 22:59:03 +00:00
Ryan Macnak 2cf981f354 [vm] Verify arity of static targets during flow graph construction.
Does not verify argument types, which remains a source of unsoundness.

Bug: https://github.com/dart-lang/sdk/issues/37517
Bug: https://github.com/dart-lang/sdk/issues/41482
Change-Id: I2ebfd36370bc86f9f8a0e2c2463a2f5b72a50388
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/143541
Commit-Queue: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
2020-04-15 22:29:04 +00:00
Alexander Markov d5c38cd354 [vm/nnbd] Use InitStaticField instruction for late static fields
Issue: https://github.com/dart-lang/sdk/issues/41299
Issue: https://github.com/dart-lang/sdk/issues/41417
Issue: https://github.com/dart-lang/sdk/issues/40796
Change-Id: Ibcc0ea55c6262ccafdda6c3fb1b28f357297c1de
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/143100
Reviewed-by: Martin Kustermann <kustermann@google.com>
Reviewed-by: Liam Appelbe <liama@google.com>
Benchmark: Vyacheslav Egorov <vegorov@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2020-04-15 20:04:34 +00:00
Martin Kustermann af4bd2719e [vm/compiler] Add support for PC-relative tail calls and use it in TailCallInstr
Flutter gallery total size:
  - armv7: -0.15%
  - armv8: -0.33%

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

Change-Id: I99959de45f43ca0c892cea6382ee7252e9c4f764
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/142841
Commit-Queue: Martin Kustermann <kustermann@google.com>
Reviewed-by: Daco Harkes <dacoharkes@google.com>
2020-04-15 14:10:53 +00:00
Alexander Markov bbbabcdacd [vm/nnbd] Take non-nullability of types into account in the VM
This change assumes that NNBD strong mode is sound.

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

Change-Id: I5f20fff05196abd4ae183a747865d3dec5a6ccda
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/143021
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2020-04-10 20:08:14 +00:00
Johnni Winther 32f82b5852 [CFE] Add NNBD compilation mode into kernel component
Fixes https://github.com/dart-lang/sdk/issues/41311

Change-Id: I2f4345f8ca7a31da705fcae37a28a8b801feb5e3
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/142149
Commit-Queue: Johnni Winther <johnniwinther@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
2020-04-06 14:00:01 +00:00
Alexander Markov 3453dc5b7e [vm/nnbd] Infer more accurate types for late static fields
In JIT mode, if late static field is already initialized we don't need
to infer nullable type for its LoadStaticField, as sentinel checks
can be removed at that point. This change modifies type propagation to
only force nullable types for late static fields which are not
initialized yet.

Also, this change removes unnecessary RecordStore(Object::null_object())
for late static fields, as guards are not generated for static fields
and guarded_cid for those fields is not be updated.

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

Change-Id: I35c8297a0dbf62bbe3c318fe8944d10136b139d1
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/141940
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2020-04-02 16:33:34 +00:00
Daco Harkes 445d279ff3 [vm] Add Reachability Fence Instruction
The reachability fence keeps a value alive and reachable.

Required for finalizers: https://github.com/dart-lang/sdk/issues/35770

Design: go/dart-ffi-finalizers (See "Premature Cleanup (Single Object)".)

Change-Id: I9742889f0f8d8b15bbcb5dca47f2a4231899dd59
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,dart-sdk-linux-try,analyzer-analysis-server-linux-try,analyzer-linux-release-try,front-end-linux-release-x64-try,vm-kernel-precomp-win-release-x64-try,vm-kernel-mac-debug-x64-try,vm-kernel-nnbd-linux-debug-x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/136188
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2020-03-26 18:30:44 +00:00
Siva Annamalai ba389f9061 Revert "[VM] - Delete non-nullable-flag() function and adjust code that was"
This reverts commit 1178f96600.

Reason for revert: "Gets an error VM initialization failed: To use --null-safety, please enable --enable-experiment=non-nullable"

Original change's description:
> [VM] - Delete non-nullable-flag() function and adjust code that was
>        using it.
> 
> Change-Id: Ibaf439fbef5e5e183f16240c4ee02b7031bc35c4
> Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/140882
> Commit-Queue: Siva Annamalai <asiva@google.com>
> Reviewed-by: Régis Crelier <regis@google.com>

TBR=kevmoo@google.com,asiva@google.com,regis@google.com

Change-Id: Ia651ec60f8ecfc82a305bcff855a6ca6c2ab9e27
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/141026
Reviewed-by: Siva Annamalai <asiva@google.com>
Commit-Queue: Siva Annamalai <asiva@google.com>
2020-03-26 03:32:56 +00:00
asiva 1178f96600 [VM] - Delete non-nullable-flag() function and adjust code that was
using it.

Change-Id: Ibaf439fbef5e5e183f16240c4ee02b7031bc35c4
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/140882
Commit-Queue: Siva Annamalai <asiva@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
2020-03-25 22:57:46 +00:00
Daco Harkes 55659b0372 [vm] Make our AOT pipeline work independent of the FLAG_precompiled_mode
Closes: https://github.com/dart-lang/sdk/issues/36521

Change-Id: I8f56d7bc9f3bfc7f4a6f0dcbee66f99838dde3cb
Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-linux-debug-x64-try,vm-kernel-linux-debug-x64-try,vm-kernel-linux-release-simarm-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/136622
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2020-03-25 11:58:20 +00:00
Alexander Markov fa54a92970 [vm/nnbd] NNBD fixes for bytecode
* Take nullability of type parameters into account.
* Handle CheckNull instruction with null selector name.

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

Change-Id: I0ff4c2790ea63e8f23ead6c9f479b8806045f012
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/140800
Reviewed-by: Régis Crelier <regis@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2020-03-24 21:50:57 +00:00
asiva 1bab476834 [VM/NNBD] - Make the null safety flag be isolate specific.
Change-Id: I73a1e8a22db770ca14af6d53707a335bbbcdabcb
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/139029
Commit-Queue: Siva Annamalai <asiva@google.com>
Reviewed-by: Régis Crelier <regis@google.com>
2020-03-20 02:09:29 +00:00
Regis Crelier eca06cd299 [VM/nnbd] Normalize FutureOr<T> when loading kernel file.
CFE does not always normalize FutureOr<T> eagerly, e.g. it does not normalize
FutureOr<Null> parsed in the source. However, it normalizes inference or
instantiation results.
For performance reasons, the VM chooses to do it eagerly, i.e. it must also
normalize unnormalized types from a kernel file.

Change-Id: I5798333ba3c58c5b2851045ef32c345d94f58268
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/139955
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Régis Crelier <regis@google.com>
2020-03-19 00:19:10 +00:00
Martin Kustermann 8acd25a2e8 [vm/reload] Use CFEs Class::hasConstConstructor flag
The CFE has added this flag (on VM's request) in [0]. We can now use it
instead of our approximation of all fields are final (i.e. this is a
follow-up to [1])

[0] https://dart-review.googlesource.com/c/sdk/+/134292
[1] https://dart-review.googlesource.com/c/sdk/+/133228

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

Change-Id: I3975ef84f29cd47d56b5a3211c649d42da654f53
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/139620
Commit-Queue: Martin Kustermann <kustermann@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
2020-03-17 17:33:02 +00:00
Victor Lima 8fd8fec185 [vm/aot] Add support to instance calls with unboxed parameters
In order to have instance calls with unboxed parameters, all
the possible targets need to be able to those parameters unboxed.
Then, the methods were partitioned according to the class hierarchy,
and the inferred types from TFA are used to determine the parameters
that could be unboxed.

This is done for non-nullable integer and double parameters, and
return value.

dart-aot linux x64:

Bench2D                8.028%
DeltaBlue              4.688%
ParticleSystemPaint    27.79%

Flutter release android-armv8:

velocity_tracker_bench -2.026% (less is better)

flutter_gallery_total_size -0.1460%
flutter_gallery_instructions_size -0.2715%
flutter_gallery_readonlydata_size 0.0539%

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

Change-Id: Iedd9b4321c3d78b406ea1708e15c747754433027
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/138501
Commit-Queue: Victor Agnez Lima <victoragnez@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
Reviewed-by: Samir Jindel <sjindel@google.com>
2020-03-06 19:47:23 +00:00
Liam Appelbe 2c5a56e7bb [vm] Disable late field init for constructor initialized fields
Change-Id: Ibdab37839d07b77bf2c92a09f760f44b54d94bcb
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/138620
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Liam Appelbe <liama@google.com>
2020-03-06 17:10:08 +00:00
Liam Appelbe 331067017f [vm] Fix late field store bug
Late field stores were being incorrectly marked as initializations,
causing them to be incorrectly optimised out in some cases.

Change-Id: I7487d24238af3b3922e76a9ca6ae6df4bf5ab849
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/138566
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Liam Appelbe <liama@google.com>
Commit-Queue: Liam Appelbe <liama@google.com>
2020-03-05 23:34:16 +00:00
Daco Harkes d950783c07 [vm/ffi] Unify RawTypedData::data and Pointer::data
This does not make FFI Structs with TypedData yet, but makes the loads/stores support using TypedData.

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

Change-Id: I5d03e324c98c79c07955d70db86ab2e2d8dc4ec2
Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,dart-sdk-linux-try,analyzer-analysis-server-linux-try,analyzer-linux-release-try,front-end-linux-release-x64-try,vm-kernel-precomp-win-release-x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/137305
Commit-Queue: Daco Harkes <dacoharkes@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
2020-03-05 17:18:24 +00:00
Daco Harkes b406802981 [vm/ffi] Unbox Pointer data field
This regresses Pointer load and store loops because LoadUntagged is never hoisted out of loops. But with support for passing TypedData, in a follow up CL, we cannot assume that only Pointers are passed in the future.

It also changes the FfiCallInstr context to hold the Pointer, rather than the address, as call sites can be unoptimized and we cannot handle an untagged address there.

Issue: https://github.com/dart-lang/sdk/issues/40767
Issue: https://github.com/dart-lang/sdk/issues/36730
Change-Id: Icc716d79eb9eb2b5aac4f03dbf6c622a6825ffdc
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/137793
Reviewed-by: Martin Kustermann <kustermann@google.com>
2020-03-05 17:18:24 +00:00
Daco Harkes 46bc5cd634 [vm] Support using different representations in ConvertUnboxedToUntagged
Change-Id: Ie84e7f5c966a428c69ef5017e89cf41e52031a42
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/137792
Reviewed-by: Martin Kustermann <kustermann@google.com>
2020-03-05 17:18:24 +00:00