dart-sdk/runtime/lib
Tess Strickland c93f924c82 [vm/compiler] Further optimize setRange on TypedData receivers.
When setRange is called on a TypedData receiver and the source is also
a TypedData object with the same element size and clamping is not
required, the VM implementation now calls _boundsCheckAndMemcpyN for
element size N. The generated IL for these methods performs the copy
using the MemoryCopy instruction (mostly, see the note below).

Since the two TypedData objects might have the same underlying
buffer, the CL adds a can_overlap flag to the MemoryCopy instruction
which checks for overlapping regions. If can_overlap is set, then
the copy is performed backwards instead of forwards when needed
to ensure that elements of the source region are read before
they are overwritten.

The existing uses of the MemoryCopy instruction are adjusted as
follows:
* The IL generated for copyRangeFromUint8ListToOneByteString
  passes false for can_overlap, as all uses currently ensure that
  the OneByteString is non-external and thus cannot overlap.
* The IL generated for _memCopy, used by the FFI library, passes
  true for can_overlap, as there is no guarantee that the regions
  pointed at by the Pointer objects do not overlap.

The MemoryCopy instruction has also been adjusted so that all numeric
inputs (the two start offsets and the length) are either boxed or
unboxed instead of just the length. This exposed an issue
in the inliner, where unboxed constants in the callee graph were
replaced with boxed constants when inlining into the caller graph,
since withList calls setRange with constant starting offsets of 0.
Now the representation of constants in the callee graph are preserved
when inlining the callee graph into the caller graph.

Fixes https://github.com/dart-lang/sdk/issues/51237 by using TMP
and TMP2 for the LDP/STP calls in the 16-byte element size case, so no
temporaries need to be allocated for the instruction.

On ARM when not unrolling the memory copy loop, uses TMP and a single
additional temporary for LDM/STM calls in the 8-byte and 16-byte
element cases, with the latter just using two LDM/STM calls within
the loop, a different approach than the one described in
https://github.com/dart-lang/sdk/issues/51229 .

Note: Once the number of elements being copied reaches a certain
threshold (1048576 on X86, 256 otherwise), _boundsCheckAndMemcpyN
instead calls _nativeSetRange, which is a native call that uses memmove
from the standard C library for non-clamped inputs. It does this
because the code currently emitted for MemoryCopy performs poorly
compared to the more optimized memmove implementation when copying
larger regions of memory.

Notable benchmark changes for dart-aot:
* X64
  * TypedDataDuplicate.*.fromList improvement from ~13%-~250%
  * Uf8Encode.*.10 improvement from ~50%-~75%
  * MapCopy.Map.*.of.Map.* improvement from ~13%-~65%
  * MemoryCopy.*.setRange.* improvement from ~13%-~500%
* ARM7
  * Uf8Encode.*.10 improvement from ~35%-~70%
  * MapCopy.Map.*.of.Map.* improvement from ~6%-~75%
  * MemoryCopy.*.setRange.{8,64} improvement from ~22%-~500%
    * Improvement of ~100%-~200% for MemoryCopy.512.setRange.*.Double
    * Regression of ~40% for MemoryCopy.512.setRange.*.Uint8
    * Regression of ~85% for MemoryCopy.4096.setRange.*.Uint8
* ARM8
  * Uf8Encode.*.10 improvement from ~35%-~70%
  * MapCopy.Map.*.of.Map.* improvement from ~7%-~75%
  * MemoryCopy.*.setRange.{8,64} improvement from ~22%-~500%
    * Improvement of ~75%-~160% for MemoryCopy.512.setRange.*.Double
    * Regression of ~40% for MemoryCopy.512.setRange.*.Uint8
    * Regression of ~85% for MemoryCopy.4096.setRange.*.Uint8

TEST=vm/cc/IRTest_Memory, co19{,_2}/LibTest/typed_data,
     lib{,_2}/typed_data, corelib{,_2}/list_test

Issue: https://github.com/dart-lang/sdk/issues/42072
Issue: b/294114694
Issue: b/259315681

Change-Id: Ic75521c5fe10b952b5b9ce5f2020c7e3f03672a9
Cq-Include-Trybots: luci.dart.try:vm-aot-linux-debug-simarm_x64-try,vm-aot-linux-debug-simriscv64-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-ia32-try,vm-linux-debug-simriscv64-try,vm-linux-debug-x64-try,vm-linux-debug-x64c-try,vm-mac-debug-arm64-try,vm-mac-debug-x64-try,vm-aot-linux-release-simarm64-try,vm-aot-linux-release-simarm_x64-try,vm-aot-linux-release-x64-try,vm-aot-mac-release-arm64-try,vm-aot-mac-release-x64-try,vm-ffi-qemu-linux-release-riscv64-try,vm-ffi-qemu-linux-release-arm-try,vm-aot-msan-linux-release-x64-try,vm-msan-linux-release-x64-try,vm-aot-tsan-linux-release-x64-try,vm-tsan-linux-release-x64-try,vm-linux-release-ia32-try,vm-linux-release-simarm-try,vm-linux-release-simarm64-try,vm-linux-release-x64-try,vm-mac-release-arm64-try,vm-mac-release-x64-try,vm-kernel-precomp-linux-release-x64-try,vm-aot-android-release-arm64c-try,vm-ffi-android-debug-arm64c-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/319521
Reviewed-by: Daco Harkes <dacoharkes@google.com>
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Tess Strickland <sstrickl@google.com>
2023-09-04 14:38:27 +00:00
..
array.cc Spelling pkg dev compiler 2023-01-26 09:12:41 +00:00
async.cc [vm] Remove old async_debugger flag. 2023-06-27 07:18:50 +00:00
async_sources.gni [NNBD/VM] Restructure VM patch files for the NNBD dart sdk split 2019-09-19 03:57:30 +00:00
bool.cc [vm] Make naming more consistent when converting between handles, tagged and untagged pointers. 2021-01-15 23:32:02 +00:00
convert_sources.gni Fix sources to source_set 2019-05-21 17:01:48 +00:00
core_sources.gni [vm] Remove dead runtime entries for WeakProperty 2022-01-18 19:15:25 +00:00
date.cc [vm] Remove dead _localTimeZoneAdjustmentInSeconds. 2022-07-19 17:29:04 +00:00
developer.cc [dart:developer] Add static Service.getObjectId method 2023-08-04 14:18:38 +00:00
developer_sources.gni [NNBD/VM] Restructure VM patch files for the NNBD dart sdk split 2019-09-19 03:57:30 +00:00
double.cc [vm] Update to constexpr in runtime/platform and lib. 2023-04-11 17:43:58 +00:00
errors.cc [vm] Update NULL to nullptr in runtime/lib. 2023-03-30 19:28:28 +00:00
ffi.cc [vm/ffi] Closure callbacks for sync callbacks 2023-08-25 03:35:44 +00:00
ffi_dynamic_library.cc [vm/ffi] Add DynamicLibrary.close() 2023-06-15 17:19:37 +00:00
ffi_sources.gni [NNBD/VM] Restructure VM patch files for the NNBD dart sdk split 2019-09-19 03:57:30 +00:00
function.cc [vm] Fix equality of uninstantiated generic closures 2023-03-08 21:44:56 +00:00
growable_array.cc Revert part of "[vm] Allow sharing of deeply immutable lists across isolates" 2023-02-10 20:25:59 +00:00
identical.cc [vm] Make naming more consistent when converting between handles, tagged and untagged pointers. 2021-01-15 23:32:02 +00:00
integers.cc [vm] Update NULL to nullptr in runtime/lib. 2023-03-30 19:28:28 +00:00
integers.h [vm] Better implementation of hashCode function. 2022-10-20 20:31:20 +00:00
invocation_mirror.h Revert "Revert "Dart Core Lib change to support generic functions in class NoSuchMethodError."" 2017-09-28 00:27:24 +00:00
isolate.cc [vm] Cleanup lookups in the library import 2023-08-30 17:18:53 +00:00
isolate_sources.gni [NNBD/VM] Restructure VM patch files for the NNBD dart sdk split 2019-09-19 03:57:30 +00:00
libgen_in.cc [vm] Update NULL to nullptr in runtime/lib. 2023-03-30 19:28:28 +00:00
math.cc [vm] Update NULL to nullptr in runtime/lib. 2023-03-30 19:28:28 +00:00
math_sources.gni [NNBD/VM] Restructure VM patch files for the NNBD dart sdk split 2019-09-19 03:57:30 +00:00
mirrors.cc [vm] Cleanup [PatchClass] in the VM 2023-06-29 15:03:37 +00:00
mirrors.h [VM] Implement isExtensionMember in MethodMirror and VariableMirror 2019-10-09 00:27:30 +00:00
mirrors_sources.gni [NNBD/VM] Restructure VM patch files for the NNBD dart sdk split 2019-09-19 03:57:30 +00:00
object.cc Reland "Reland "[vm] Unify hash codes in type objects"" 2023-05-26 20:13:17 +00:00
profiler.cc [ VM / Service ] Add UserTag support to C-API and send UserTagChanged 2021-06-23 00:58:47 +00:00
profiler_sources.gni Fix sources to source_set 2019-05-21 17:01:48 +00:00
regexp.cc [vm/regexp] Name generated Regexp function with actual expression. 2023-03-09 03:49:58 +00:00
simd128.cc [vm/sim/simd] Fix vmin/vmax implementation on simulator. 2022-05-11 16:59:24 +00:00
stacktrace.cc [vm] Rework awaiter stack unwinding. 2023-06-30 14:03:03 +00:00
stacktrace.h Reland "[ Service / dart:isolate ] Added getPorts RPC and 'debugName' optional" 2020-10-29 02:52:03 +00:00
stopwatch.cc [vm] refactor native entry and native entry type arguments 2018-12-13 19:29:26 +00:00
string.cc [vm] Update to constexpr in runtime/platform and lib. 2023-04-11 17:43:58 +00:00
timeline.cc [VM/Timeline] Store an array of flow IDs in each dart::TimelineEvent 2023-05-26 13:08:27 +00:00
typed_data.cc [vm/compiler] Further optimize setRange on TypedData receivers. 2023-09-04 14:38:27 +00:00
typed_data_sources.gni [NNBD/VM] Restructure VM patch files for the NNBD dart sdk split 2019-09-19 03:57:30 +00:00
uri.cc [vm] Reland: Prefix HOST_OS_* and TARGET_OS_* with DART_ 2021-07-02 19:06:45 +00:00
vmservice.cc [vm] Disentagle PortMap/MessageHandler from port status tracking 2023-08-08 10:57:47 +00:00
vmservice_sources.gni Fix sources to source_set 2019-05-21 17:01:48 +00:00