mirror of
https://github.com/dart-lang/sdk
synced 2024-10-06 16:31:07 +00:00
0d3ade255b
After https://dart-review.googlesource.com/c/sdk/+/330600, there were more chances for the optimizing compiler to introduce or move GC-triggering instructions like allocations or boxings between the retrieval of an untagged pointer to GC-moveable memory and its use. To limit the chance of this happening, this CL removes the explicit loading of the untagged payload address when building the initial flow graph in most cases when the array is not known to be an external array (an external string, an external typed data object, or an FFI Pointer). The remaining case is during view allocation, which extracts the payload address of the base typed data object underlying the view (which may be GC-movable) to calculate the payload address that should be stored in the data field of the view object. See https://github.com/dart-lang/sdk/issues/54884. During canonicalization of LoadIndexed, StoreIndexed, and MemoryCopy instructions, if the cid of an array input is an external array (external string, external typed data object, or Pointer), then a LoadField instruction that extracts the untagged payload address is inserted before the instruction and the corresponding input is rebound to that LoadField instruction. Once all compiler passes that involve code motion have been performed, a new pass looks for LoadIndexed, StoreIndexed, or MemoryCopy where the cid stored in the instruction for the array is a typed data cid. In these cases, if the array is not an internal typed data object, then the payload address is extracted. Waiting until this point ensures that no GC-triggering instructions are inserted between the extraction of the payload address and the use. (Internal typed data objects are left as-is because the payload address is inside the object itself and doesn't require indirection through the data field of the object). This CL also replaces code conditional on the array cid with code that is instead conditional on the array element representation in cases where it makes sense to do so, since this is a less brittle check than checking the array cid (e.g., checking for kUnboxedInt8 to load, store, or copy an signed byte from an array instead of listing all possible array cids that store signed bytes). This CL also fixes an issue with the ARM64 assembler where calling LoadFromOffset with an Address that has a non-Offset type would silently generate bad code instead of triggering the ASSERT in PrepareLargeOffset. TEST=vm/dart/typed_list_index_checkbound_il_test Issue: https://github.com/dart-lang/sdk/issues/54710 Cq-Include-Trybots: luci.dart.try:vm-aot-android-release-arm64c-try,vm-aot-android-release-arm_x64-try,vm-aot-linux-debug-x64-try,vm-aot-linux-debug-x64c-try,vm-aot-mac-release-arm64-try,vm-aot-mac-release-x64-try,vm-aot-obfuscate-linux-release-x64-try,vm-aot-optimization-level-linux-release-x64-try,vm-aot-win-debug-arm64-try,vm-appjit-linux-debug-x64-try,vm-asan-linux-release-x64-try,vm-checked-mac-release-arm64-try,vm-eager-optimization-linux-release-ia32-try,vm-eager-optimization-linux-release-x64-try,vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64c-try,vm-ffi-qemu-linux-release-arm-try,vm-ffi-qemu-linux-release-riscv64-try,vm-fuchsia-release-x64-try,vm-linux-debug-ia32-try,vm-linux-debug-x64-try,vm-linux-debug-x64c-try,vm-mac-debug-arm64-try,vm-mac-debug-x64-try,vm-msan-linux-release-x64-try,vm-reload-linux-debug-x64-try,vm-reload-rollback-linux-debug-x64-try,vm-ubsan-linux-release-x64-try,vm-win-debug-arm64-try,vm-win-debug-x64-try,vm-win-release-ia32-try Change-Id: I25b5f314943e9254d3d28986d720a5d47f12feeb Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/352363 Reviewed-by: Daco Harkes <dacoharkes@google.com> Reviewed-by: Ryan Macnak <rmacnak@google.com> Commit-Queue: Tess Strickland <sstrickl@google.com> Reviewed-by: Alexander Markov <alexmarkov@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com> |
||
---|---|---|
.. | ||
_http | ||
_internal | ||
_wasm | ||
async | ||
cli | ||
collection | ||
convert | ||
core | ||
developer | ||
ffi | ||
html | ||
indexed_db | ||
internal | ||
io | ||
isolate | ||
js | ||
js_interop | ||
js_interop_unsafe | ||
js_util | ||
math | ||
mirrors | ||
svg | ||
typed_data | ||
vmservice | ||
web_audio | ||
web_gl | ||
web_sql | ||
libraries.json | ||
libraries.yaml | ||
PRESUBMIT.py | ||
vmservice_libraries.json | ||
vmservice_libraries.yaml |