9fec00aeedea94ac96d6b97f9ae36910591c826f
20 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
04cc5098ab |
[vm] Enable test pattern (a&b == 0) fusion in AOT on X64/ARM64
Previously we would only fuse this pattern for Smi operations which (almost) never happens in AOT. This CL enables fusion for Int64 operations as well. The implementation is limited to X64 and ARM64 for now because implementing it on 32-bit platforms is somewhat cumbersome. Issue https://github.com/dart-lang/sdk/issues/55522 R=alexmarkov@google.com TEST=vm/cc/IL_TestIntInstr,vm/dart/test_int_pattern_il_test Cq-Include-Trybots: luci.dart.try:vm-linux-release-simarm-try,vm-aot-linux-release-simarm_x64-try,vm-aot-linux-debug-simarm_x64-try,dart-sdk-linux-riscv64-try,vm-aot-linux-debug-simriscv64-try,vm-ffi-qemu-linux-release-riscv64-try,vm-linux-debug-simriscv64-try,vm-linux-release-ia32-try Change-Id: I62a482640db45befac6b0b78850f23a8cc624c75 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/365463 Reviewed-by: Alexander Markov <alexmarkov@google.com> Commit-Queue: Slava Egorov <vegorov@google.com> |
||
|
|
9ee25d3ce1 |
Cleanup unsound mode from pkg/vm, frontend_server and dart2native
TEST=ci Change-Id: Ica8b8b68f69e8f4a8cd5af3375da4a9ff0947c35 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/364602 Reviewed-by: Johnni Winther <johnniwinther@google.com> Commit-Queue: Alexander Markov <alexmarkov@google.com> Reviewed-by: Siva Annamalai <asiva@google.com> |
||
|
|
3bc14606f9 |
[vm/compiler] Improve AOT block scheduler
Try to keep loop blocks together, previously AOT compiler would produce
bad block order for loops like these:
while (true) {
if (smth) {
// (*)
return;
}
}
And put `(*)` blocks in between loop header and other loop blocks.
TEST=ci
Cq-Include-Trybots: luci.dart.try:vm-aot-linux-debug-x64-try,vm-aot-mac-release-arm64-try,vm-aot-linux-release-x64-try
Change-Id: I52304810b61ff9288fe9df648b21c0258299d61e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/358447
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Slava Egorov <vegorov@google.com>
|
||
|
|
ac32223cea |
[vm/compiler] Improve CreateArray compile type
If we have constant type arguments include them into the type. This CL also expands IL tests framework with the capability to match CompileTypes. TEST=vm/dart/regress_53817_il_test Bug: https://github.com/dart-lang/sdk/issues/53817 Cq-Include-Trybots: luci.dart.try:vm-aot-linux-product-x64-try,vm-aot-linux-release-arm64-try,vm-aot-linux-release-simarm_x64-try,vm-aot-obfuscate-linux-release-x64-try Change-Id: I48722b002d9cd436dbc8ca3c9afbefa124f18996 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/331900 Commit-Queue: Slava Egorov <vegorov@google.com> Reviewed-by: Daco Harkes <dacoharkes@google.com> |
||
|
|
f303110aa1 |
[pkg/vm] Also check -Dtest_runner.configuration for arch-specific tests.
Add RISCV32 to the list of architectures checked for is32BitConfiguration. TEST=vm/dart/pointer_as_typed_list_il_test on android trybots Issue: https://github.com/dart-lang/sdk/issues/53774 Change-Id: I0c8297dc863b6121f9b1eafb99ae273ea2d0b34e Cq-Include-Trybots: luci.dart.try:vm-aot-android-release-arm_x64-try,vm-aot-android-release-arm64c-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/330740 Reviewed-by: Daco Harkes <dacoharkes@google.com> Commit-Queue: Tess Strickland <sstrickl@google.com> |
||
|
|
4d1bdaaca9 |
Reland "[vm/compiler] Change MemoryCopy to also take untagged addresses."
This is a reland of commit
|
||
|
|
5362d9536b |
Revert "[vm/compiler] Change MemoryCopy to also take untagged addresses."
This reverts commit
|
||
|
|
06d7a2352e |
[vm/compiler] Change MemoryCopy to also take untagged addresses.
This CL adds the ability to pass the payload address of the source and destination directly to the MemoryCopy instruction as an untagged value. The new translation of the _TypedListBase._memMoveN methods use the new MemoryCopy constructor, retrieving the untagged value of the data field of both the source and destination. This way, if inlining exposes the allocation of the object from which the data field is being retrieved, then allocation sinking can remove the intermediate allocation if there are no escaping uses of the object. Since Pointer.asTypedList allocates such ExternalTypedData objects, this CL makes that method inlined if at all possible, which removes the intermediate allocation if the only use of the TypedData object is to call setRange for memory copying purposes. This CL also separates unboxed native slots into two groups: those that contain untagged addresses and those that do not. The former group now have the kUntagged representation, which mimics the old use of LoadUntagged for the PointerBase data field and also ensures that any arithmetic operations on untagged addresses must first be explicitly converted to an unboxed integer and then explicitly converted back to untagged before being stored in a slot that contains untagged addresses. When a unboxed native slot that contains untagged addresses is defined, the definition also includes a boolean which represents whether addresses that may be moved by the GC can be stored in this slot or not. The redundancy eliminator uses this to decide whether it is safe to eliminate a duplicate load, replace a load with the value originally stored in the slot, or lift a load out of a loop. In particular, the PointerBase data field may contain GC-moveable addresses, but only for internal TypedData objects and views, not for external TypedData objects or Pointers. To allow load optimizations involving the latter, the LoadField and StoreField instructions now take boolean flags for whether loads or stores from the slot are guaranteed to not be GC-moveable, to override the information from the slot argument. Notable benchmark changes on x64 (similar for other archs unless noted): JIT: * FfiMemory.PointerPointer: 250.7% * FfiStructCopy.Copy1Bytes: -26.73% (only x64) * FfiStructCopy.Copy32Bytes: -25.18% (only x64) * MemoryCopy.64.setRange.Pointer.Uint8: 19.36% * MemoryCopy.64.setRange.Pointer.Double: 18.96% * MemoryCopy.8.setRange.Pointer.Double: 17.59% * MemoryCopy.8.setRange.Pointer.Uint8: 19.46% AOT: * FfiMemory.PointerPointer: 323.5% * FfiStruct.FieldLoadStore: 483.3% * FileIO_readwrite_64kb: 15.39% * FileIO_readwrite_512kb (Intel Xeon): 46.22% * MemoryCopy.512.setRange.Pointer.Uint8: 35.20% * MemoryCopy.64.setRange.Pointer.Uint8: 55.40% * MemoryCopy.512.setRange.Pointer.Double: 29.45% * MemoryCopy.64.setRange.Pointer.Double: 60.37% * MemoryCopy.8.setRange.Pointer.Double: 59.54% * MemoryCopy.8.setRange.Pointer.Uint8: 55.40% * FfiStructCopy.Copy32Bytes: 398.3% * FfiStructCopy.Copy1Bytes: 1233% TEST=vm/dart/address_local_pointer, vm/dart/pointer_as_typed_list Issue: https://github.com/dart-lang/sdk/issues/42072 Fixes: https://github.com/dart-lang/sdk/issues/53124 Cq-Include-Trybots: luci.dart.try:vm-ffi-qemu-linux-release-arm-try,vm-eager-optimization-linux-release-x64-try,vm-linux-release-x64-try,vm-linux-debug-x64-try,vm-aot-linux-release-x64-try,vm-aot-linux-debug-x64-try Change-Id: I563e0bfac5b1ac6cf1111649934067c12891b631 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/324820 Reviewed-by: Alexander Markov <alexmarkov@google.com> Commit-Queue: Tess Strickland <sstrickl@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com> |
||
|
|
e2fe203adc |
[deps] roll package:lints to the latest
Change-Id: I582f956cd4b712203c2f6dd630b4e1384040446d Tested: analysis clean (this is a lint only related change) Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/329400 Reviewed-by: Phil Quitslund <pquitslund@google.com> Reviewed-by: Samuel Rawlins <srawlins@google.com> Commit-Queue: Devon Carew <devoncarew@google.com> |
||
|
|
80c79a3d84 |
[vm/test] Support declaring multiple instruction attributes.
Using the preprocessor string literal operator # on __VA_ARGS__ in a variadic macro does not separately stringize each argument, but instead creates a single string of the expanded arguments. Thus, rename DECLARE_ATTRIBUTES to DECLARE_ATTRIBUTE and have it take a single expression. For multiple attributes, DECLARE_ATTRIBUTES_NAMED must be used instead. Also, use a comma fold expression in AttributesSerializer::WriteTuple to separately call WriteAttribute with each element of the tuple in turn, instead of calling WriteAttribute once with all the tuple contents as arguments. Move the demangling of attribute names that are directly stringized from expressions from the JSON consumer to the JSON producer. To illustrate how to add multiple attributes to an instruction, this CL adds two attributes to the StoreField instruction: slot and is_initialization. When printing an instruction in the IL matcher, if the instruction has any boolean attributes, don't print the attribute if the value is false and only print the name if the attribute is true to reduce clutter. TEST=ci Change-Id: Ie541364374171c3dcbee4b609942d415a1c464e8 Cq-Include-Trybots: luci.dart.try:vm-aot-linux-debug-x64-try,vm-aot-linux-release-x64-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/327864 Reviewed-by: Alexander Markov <alexmarkov@google.com> Commit-Queue: Tess Strickland <sstrickl@google.com> |
||
|
|
4352985e11 |
[vm/compiler] Perform inlining of _TypedList._getX in AOT.
This is a partial reland of
|
||
|
|
cb39b9ff07 |
Revert "[vm/compiler] Perform inlining of _TypedList._getX in AOT."
This reverts commit
|
||
|
|
6673f84d59 |
[vm/compiler] Perform inlining of _TypedList._getX in AOT.
Before, the inliner only replaced calls to the _TypedList._getX methods with specialized IL if speculation was allowed. This means that the inlining would not happen in AOT mode, even though the generated IL does not require speculation. In addition, this CL replaces the native functions used for the base definition of _TypedList._getX and _TypedList._setX with versions built in the FlowGraphBuilder. With this, the VM avoids the overhead of going to the runtime for a native call when these methods are not inlined, which should also reduce the impact of a failure to inline. TEST=vm/dart/inline_TypedList_getUint32 Issue: https://github.com/dart-lang/sdk/issues/53513 Cq-Include-Trybots: luci.dart.try:vm-aot-linux-debug-simarm_x64-try,vm-aot-linux-debug-x64-try,vm-aot-linux-debug-x64c-try,vm-kernel-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-linux-debug-x64-try,vm-linux-debug-x64c-try,vm-mac-debug-arm64-try,vm-aot-linux-release-simarm_x64-try,vm-aot-linux-release-x64-try,vm-aot-mac-release-arm64-try,vm-linux-release-x64-try,vm-mac-release-arm64-try,vm-kernel-precomp-linux-release-x64-try Change-Id: I66b6b8634b2b9b413fb745f02433eb58f2ff913e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/325703 Reviewed-by: Martin Kustermann <kustermann@google.com> Commit-Queue: Tess Strickland <sstrickl@google.com> Reviewed-by: Alexander Markov <alexmarkov@google.com> |
||
|
|
98d9a31dbc |
[vm/testing] Improve il_matchers obfuscation support
Recognize "Instance of C" string and handle it in special way: apply renaming to class name (C) only. Fixes https://github.com/dart-lang/sdk/issues/53512 TEST=vm/dart/comparison_canonicalization_il_test in obfuscate configuration Fixed: 53512 Cq-Include-Trybots: luci.dart.try:vm-aot-obfuscate-linux-release-x64-try Change-Id: I3fa31ab52aef01417d523a075913a0971158be72 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/326062 Reviewed-by: Martin Kustermann <kustermann@google.com> Commit-Queue: Slava Egorov <vegorov@google.com> |
||
|
|
5c320a108a |
[vm/compiler] Improve flow sensitivity of CP
Before running CP find all branches of form `Branch(v eq C)`, where `eq` is one of `===`, `==`, `!==` or `!=` and `C` is a constant and insert a redefinition of `v` in the true successor which captures the information that `v` is equal to `C` guaranteed by the branch. SCCP algorithm can then use this information when propagating constants. After SCCP all redefinitions inserted are removed again. We don't actually replace `v` with `C` in the dominated code because this might lead to issues later, for example it might result in redundant phis `phi(C, v)` (`C` flowing from a predecessor where `v == C`) which are complicated to eliminate again. TEST=vm/dart/comparison_canonicalization_il_test Cq-Include-Trybots: luci.dart.try:vm-aot-linux-release-x64-try,vm-aot-linux-debug-simarm_x64-try,vm-aot-linux-debug-x64-try,vm-aot-android-release-arm64c-try Change-Id: I388dddb97b5e35f09d9904000c585864f27400f6 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/324980 Reviewed-by: Alexander Markov <alexmarkov@google.com> Commit-Queue: Slava Egorov <vegorov@google.com> |
||
|
|
7ff975c2e5 |
[vm/compiler] Fix InferredTypeMetadata::IsTrivial
`IsTrivial` is supposed to return true iff `ToCompileType` would produce a trivial (dynamic) type. However `IsTrivial` was taking some of the irrevant parts of the `InferredTypeMetadata` into account - meaning that it returned `false` where it should have returned `true`. This lead us to assign useless `dynamic` result type to various `StaticCall`, some of these calls can later be lowered to `LoadIndexed` instructions, which will then also get the `dynamic` result type. This useless type will then take priority over more precise element type which could be inferred by `LoadIndexedInstr::ComputeType` TEST=vm/dart/load_indexed_trivial_type_il_test Cq-Include-Trybots: luci.dart.try:vm-aot-linux-release-x64-try,vm-aot-linux-debug-simarm_x64-try,vm-aot-linux-debug-x64-try,vm-aot-android-release-arm64c-try Change-Id: I69ee965ba0d0ac85ede3989680371f0dda19d8a9 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/325302 Reviewed-by: Alexander Markov <alexmarkov@google.com> Commit-Queue: Slava Egorov <vegorov@google.com> |
||
|
|
c3d8f46c5b |
[vm/compiler] Devirtualize calls while inlining.
Inlined functions might contain call-sites which can be devirtualized in the context of the caller. To achieve that we add a pass which calls canonicalization on all dynamic calls (and their data dependencies) between rounds of inlining. More specifically this helps cases which require interleaving some redundancy elimination and inlining to remove the cost of abstractions. The primary example is for-in loop with an array of a known type which usually requires inlining `get:iterator` and propagating iterable value through interator's fields to specialize and inline `get:length` and `operator[]` on the `Iterable`. See https://github.com/dart-lang/sdk/issues/48433 for example. TEST=vm/dart/devirtualization_during_inlining_il_test Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-release-simarm-try,vm-kernel-precomp-linux-product-x64-try Change-Id: I1fae50484a111f8c21c81bcf0c3d6a63a856338a Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/279517 Reviewed-by: Alexander Markov <alexmarkov@google.com> Commit-Queue: Slava Egorov <vegorov@google.com> |
||
|
|
77c79d678e |
[pkg/vm] analyze using package:lints
Tested: via static analysis on the CI Change-Id: Icffb8d52001d5099cca3ab1f153d3f6e5300177d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/250770 Commit-Queue: Devon Carew <devoncarew@google.com> Reviewed-by: Siva Annamalai <asiva@google.com> |
||
|
|
12b1773deb |
[vm] Fix issues with flutter_regress_91370_il_test
* Add Canonicalize pass after CSE to erase graph differences between 64-bit and 32-bit platforms. These differences originate from different treatment of integers (we unbox more eagerly on 64-bit platform) and consequently affect load forwarding - which generates some redundant[1] phis on 64-bit platform, but not on 32-bit platform. Adding this pass also addresses other cases of unpredictable performance when IL changes can cause CSE not to trigger a Canonicalize inside itself and regress performance, by inhibiting subsequent optimizations. * Allow IL tests to check whether the graph was compiled in sound null safety mode or not - because graphs can have minor differences. * Use `"$i"` instead of `i.toString()` in the test to allow TFA to infer non-nullability of fields in non-sound-nullsafety mode. [1] The definition of redundant phi differs between canonicalization pass and load forwarding pass. The former unwraps redefinitions and the latter does not. We are going to address this difference in a more systematic way when we split input dependencies from control dependencies. TEST=ci Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-product-x64-try,vm-kernel-precomp-linux-release-x64-try,vm-kernel-precomp-linux-release-simarm-try,vm-kernel-precomp-nnbd-linux-release-x64-try,vm-kernel-precomp-nnbd-linux-release-simarm_x64-try Change-Id: Ifbd68fbb7f3b374ecee8ada1b3a4a2249139a108 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/220541 Commit-Queue: Slava Egorov <vegorov@google.com> Reviewed-by: Daco Harkes <dacoharkes@google.com> |
||
|
|
a643e537fb |
[vm/infra] Improve IL testing framework
* Add support for dumping flow graphs in JSON (to make it machine
readable);
* Add support for controlling which functions are dumped through
a pragma annotation:
`@pragma('vm:testing:print-flow-graph'[, "passes filter"])`
* Replace simple matching DSL with programmatic matching
* Support obfuscated builds
Fixes https://github.com/dart-lang/sdk/issues/47340
TEST=vm/dart{,_2}/aot_prefer_equality_comparison_il_test
Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-linux-debug-x64-try,vm-kernel-precomp-linux-product-x64-try,vm-kernel-precomp-linux-release-x64-try
Change-Id: Ie067ba451d311e6019a8c3a88c012231b0c50eb5
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/219240
Commit-Queue: Slava Egorov <vegorov@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
|