summaryrefslogtreecommitdiff
path: root/compiler/utils/jni_macro_assembler.h
AgeCommit message (Collapse)Author
2024-03-26Rename enums.h/.cc to pointer_size.h/.cc. Santiago Aboy Solanes
It was the only enum in the file Bug: 329378408 Test: art/test/testrunner/testrunner.py --host --64 --optimizing -b Change-Id: If0e385324afa3685f648135ba9b60e6bc79ba0ed
2024-02-21Allocate JNI assembler labels with `ArenaAllocator`. Vladimir Marko
Test: m test-art-host-gtests Test: testrunner.py --host --optimizing Bug: 181943478 Change-Id: I7b3c7b20ead48924c061ae465208bc90e9a10676
2024-02-12JNI: Keep previous LRT state in callee-save reg. Vladimir Marko
Golem results for art-opt-cc (higher is better): linux-armv7 (Odroid-C2) before after NativeDowncallStaticFast 21.622 21.923 (+1.395%) NativeDowncallStaticFast6 18.491 18.719 (+1.236%) NativeDowncallStaticFastRefs6 15.347 15.504 (+1.025%) NativeDowncallVirtualFast 20.741 21.319 (+2.787%) NativeDowncallVirtualFast6 18.953 19.183 (+1.218%) NativeDowncallVirtualFastRefs6 15.500 15.663 (+1.053%) NativeDowncallStaticNormal 14.620 14.757 (0.9495%) NativeDowncallStaticNormal6 13.120 13.235 (+0.8823%) NativeDowncallStaticNormalRefs6 11.454 11.538 (+0.7258%) NativeDowncallVirtualNormal 14.216 14.486 (+1.898%) NativeDowncallVirtualNormal6 13.347 13.466 (+0.8978%) NativeDowncallVirtualNormalRefs6 11.538 11.628 (+0.7752%) linux-armv7 (Raspberry Pi 4) before after NativeDowncallStaticFast 43.305 42.331 (-2.250%) NativeDowncallStaticFast6 35.608 37.369 (+4.945%) NativeDowncallStaticFastRefs6 31.390 31.793 (+1.285%) NativeDowncallVirtualFast 33.814 31.825 (-5.882%) NativeDowncallVirtualFast6 34.311 36.445 (+6.220%) NativeDowncallVirtualFastRefs6 31.762 32.419 (+2.069%) NativeDowncallStaticNormal 13.848 14.244 (+2.859%) NativeDowncallStaticNormal6 13.592 13.725 (+0.9804%) NativeDowncallStaticNormalRefs6 12.671 12.536 (-1.061%) NativeDowncallVirtualNormal 13.979 13.848 (-0.9397%) NativeDowncallVirtualNormal6 13.242 13.592 (+2.647%) NativeDowncallVirtualNormalRefs6 12.364 12.358 (-0.094%) linux-armv8 (Odroid-C2) before after NativeDowncallStaticFast 24.752 25.160 (+1.648%) NativeDowncallStaticFast6 22.571 22.908 (+1.494%) NativeDowncallStaticFastRefs6 19.183 19.183 (unchanged) NativeDowncallVirtualFast 21.622 22.244 (+2.879%) NativeDowncallVirtualFast6 21.319 21.934 (+2.887%) NativeDowncallVirtualFastRefs6 17.448 17.848 (+2.296%) NativeDowncallStaticNormal 17.048 17.250 (+1.183%) NativeDowncallStaticNormal6 15.992 16.161 (+1.054%) NativeDowncallStaticNormalRefs6 14.085 14.216 (+0.9314%) NativeDowncallVirtualNormal 15.504 15.826 (+2.077%) NativeDowncallVirtualNormal6 15.347 15.663 (+2.064%) NativeDowncallVirtualNormalRefs6 13.466 13.586 (+0.8859%) linux-armv8 (Raspberry Pi 4) before after NativeDowncallStaticFast 38.366 40.796 (+6.335%) NativeDowncallStaticFast6 38.347 40.419 (+5.405%) NativeDowncallStaticFastRefs6 31.636 32.528 (+2.820%) NativeDowncallVirtualFast 35.201 37.406 (+6.266%) NativeDowncallVirtualFast6 34.000 35.626 (+4.782%) NativeDowncallVirtualFastRefs6 27.201 27.201 (unchanged) NativeDowncallStaticNormal 14.808 15.107 (+2.024%) NativeDowncallStaticNormal6 14.955 14.428 (-3.526%) NativeDowncallStaticNormalRefs6 14.174 13.855 (-2.254%) NativeDowncallVirtualNormal 14.735 14.307 (-2.904%) NativeDowncallVirtualNormal6 14.244 14.385 (+0.9921%) NativeDowncallVirtualNormalRefs6 14.105 14.244 (+0.9823%) linux-ia32 before after NativeDowncallStaticFast 223.66 233.77 (+4.516%) NativeDowncallStaticFast6 159.76 163.92 (+2.602%) NativeDowncallStaticFastRefs6 137.16 141.72 (+3.324%) NativeDowncallVirtualFast 211.79 224.05 (+5.791%) NativeDowncallVirtualFast6 149.85 154.00 (+2.769%) NativeDowncallVirtualFastRefs6 132.17 136.93 (+3.603%) NativeDowncallStaticNormal 51.091 51.091 (unchanged) NativeDowncallStaticNormal6 45.680 45.703 (+0.0497%) NativeDowncallStaticNormalRefs6 44.732 45.161 (+0.9606%) NativeDowncallVirtualNormal 50.450 50.450 (unchanged) NativeDowncallVirtualNormal6 45.161 45.161 (unchanged) NativeDowncallVirtualNormalRefs6 44.125 44.147 (+0.496%) linux-x64 before after NativeDowncallStaticFast 173.07 181.05 (+4.611%) NativeDowncallStaticFast6 156.50 161.34 (+3.092%) NativeDowncallStaticFastRefs6 130.37 131.61 (+0.9499%) NativeDowncallVirtualFast 169.00 174.83 (+3.447%) NativeDowncallVirtualFast6 148.13 149.35 (+0.8243%) NativeDowncallVirtualFastRefs6 127.31 130.11 (+2.200%) NativeDowncallStaticNormal 47.952 47.952 (unchanged) NativeDowncallStaticNormal6 46.789 46.789 (unchanged) NativeDowncallStaticNormalRefs6 44.643 44.643 (unchanged) NativeDowncallVirtualNormal 47.358 47.358 (unchanged) NativeDowncallVirtualNormal6 45.703 45.680 (-0.0497%) NativeDowncallVirtualNormalRefs6 44.643 44.643 (unchanged) Test: m test-art-host-gtest Test: testrunner.py --host Test: run-gtests.sh Test: testrunner.py --target --optimizing Bug: 172332525 Change-Id: I9606412c658cae8b7583308facf5ba095a982349
2024-02-08Use register pair loads/stores in JNI stubs... Vladimir Marko
... on arm/arm64 for local reference frame manipulation. Golem results for art-opt-cc (higher is better): linux-armv7 (Odroid-C2) before after NativeDowncallStaticFast 21.622 21.622 (unchanged) NativeDowncallStaticFast6 18.500 18.491 (-0.0500%) NativeDowncallStaticFastRefs6 15.354 15.354 (unchanged) NativeDowncallVirtualFast 21.027 20.741 (-1.361%) NativeDowncallVirtualFast6 18.953 18.953 (unchanged) NativeDowncallVirtualFastRefs6 15.504 15.504 (unchanged) NativeDowncallStaticNormal 14.620 14.620 (unchanged) NativeDowncallStaticNormal6 13.120 13.120 (unchanged) NativeDowncallStaticNormalRefs6 11.454 11.454 (unchanged) NativeDowncallVirtualNormal 14.342 14.216 (-0.8823%) NativeDowncallVirtualNormal6 13.347 13.347 (unchanged) NativeDowncallVirtualNormalRefs6 11.538 11.544 (+0.0481%) linux-armv7 (Raspberry Pi 4) before after NativeDowncallStaticFast 41.937 41.564 (-0.8906%) NativeDowncallStaticFast6 33.234 35.608 (+7.144%) NativeDowncallStaticFastRefs6 30.527 31.469 (+3.085%) NativeDowncallVirtualFast 37.531 35.429 (-5.600%) NativeDowncallVirtualFast6 32.803 34.125 (+4.028%) NativeDowncallVirtualFastRefs6 30.500 31.500 (+3.279%) NativeDowncallStaticNormal 13.599 14.112 (+3.773%) NativeDowncallStaticNormal6 13.599 13.599 (unchanged) NativeDowncallStaticNormalRefs6 12.358 12.677 (+2.580%) NativeDowncallVirtualNormal 13.473 13.848 (+2.781%) NativeDowncallVirtualNormal6 13.235 13.242 (+0.0495%) NativeDowncallVirtualNormalRefs6 12.165 12.364 (+1.632%) linux-armv8 (Odroid-C2) before after NativeDowncallStaticFast 23.988 24.765 (+3.238%) NativeDowncallStaticFast6 21.923 22.571 (+2.955%) NativeDowncallStaticFastRefs6 18.719 19.183 (+2.480%) NativeDowncallVirtualFast 21.027 21.622 (+2.828%) NativeDowncallVirtualFast6 20.267 21.319 (+5.190%) NativeDowncallVirtualFastRefs6 16.683 17.448 (+4.583%) NativeDowncallStaticNormal 16.683 17.057 (+2.239%) NativeDowncallStaticNormal6 15.656 15.992 (+2.149%) NativeDowncallStaticNormalRefs6 13.958 14.085 (+0.9054) NativeDowncallVirtualNormal 15.196 15.504 (+2.026%) NativeDowncallVirtualNormal6 15.049 15.347 (+1.980%) NativeDowncallVirtualNormalRefs6 13.006 13.466 (+3.541%) linux-armv8 (Raspberry Pi 4) before after NativeDowncallStaticFast 36.482 38.366 (+5.164%) NativeDowncallStaticFast6 37.406 38.366 (+2.564%) NativeDowncallStaticFastRefs6 28.770 31.652 (+10.02%) NativeDowncallVirtualFast 34.000 35.201 (+3.532%) NativeDowncallVirtualFast6 33.251 34.000 (+2.254%) NativeDowncallVirtualFastRefs6 26.474 27.201 (+2.747%) NativeDowncallStaticNormal 14.237 14.606 (+2.592%) NativeDowncallStaticNormal6 14.244 14.948 (+4.942%) NativeDowncallStaticNormalRefs6 13.012 14.181 (+8.983%) NativeDowncallVirtualNormal 14.105 14.663 (+3.954%) NativeDowncallVirtualNormal6 13.979 14.735 (+5.406%) NativeDowncallVirtualNormalRefs6 13.725 14.244 (+3.775%) The Odroid-C2 results appear essentially unchanged for armv7 (with some minor regressions within noise) and only little better for armv8 (but still likely within noise). On the Raspberry Pi 4, there appears to be some improvement for armv7 and a decent improvement for armv8 but there is higher level of noise than on Odroid-C2. Results from this single run are not very conclusive but we expect to see a clear trend in the data after submission. Test: m test-art-host-gtest Test: testrunner.py --host --optimizing Test: run-gtest.sh Test: testrunner.py --target --optimizing Bug: 172332525 Change-Id: I01033950355c988c8a0e7ed6bdb6e585587dcfb4
2023-12-14riscv64: Fix wrong sign-extension for references. Vladimir Marko
Test: Modify kPreferredAllocSpaceBegin = 0x90000000, then testrunner.py --target --64 --ndebug --optimizing Bug: 283082089 Change-Id: Ifb82d616a0d9664a2e7f5f96a1a79ddce5862cdf
2023-06-29riscv64: Enable JNI compiler. Vladimir Marko
Implement the required `WriteCIE()`, fix a bug in the `art_jni_dlsym_lookup_critical_stub`, fix reference loads to be zero-extended and enable the JNI compiler for riscv64. Test: m test-art-host-gtest Test: testrunner.py --host --optimizing Test: run-gtests.sh Test: testrunner.py --target --64 --ndebug --prebuild --no-prebuild -t 178 Test: # Edit `run-test` to disable checker, then testrunner.py --target --64 --ndebug --cdex-none --optimizing # 7 tests fail (pre-existing failures): 004-StackWalk, 137-cfi, # 2042-reference-processing, 597-deopt-busy-loop, 629-vdex-speed, # 638-checker-inline-cache-intrinsic and 661-oat-writer-layout. Test: aosp_cf_riscv64_phone-userdebug boots without crashes. Bug: 283082089 Change-Id: Ifd47098b7428919b601dd22a130ad1bd51ae516d
2023-06-21Remove CodeAllocator and the extra copy of generated code. Nicolas Geoffray
The code used to copy the final generated code twice: from assembler to CodeAllocator, and then to CodeAllocator to SwapAllocator/JitMemory. The assemblers never depended on the exact location of the generated code, so just drop that feature. Test: test.py Change-Id: I8dc82e4926097092b9aac336a5a5d40f79dc62ca
2023-04-04JNI: Fast-path for decoding returned jobject. Vladimir Marko
Results for the timeGetBytesAscii#EMPTY benchmark from the libcore's StringToBytesBenchmark suite on blueline-userdebug with the cpu frequencies fixed at 1420800 (cpus 0-3; little) and 1459200 (cpus 4-7; big): 32-bit little: ~415 -> ~390 64-bit little: ~415 -> ~390 32-bit big: ~180 -> ~170 64-bit big: ~180 -> ~170 Test: m test-art-host-gtest Test: testrunner.py --host --optimizing --debug --ndebug Test: run-gtests.sh Test: testrunner.py --target --optimizing --debug --ndebug Bug: 172332525 Change-Id: I0e19d583e5141e99a8b8c6fd9ae125fe7c9e02e7
2023-03-09Remove obsolete functions from JNI macro assemblers. Vladimir Marko
Remove obsolete methods and related T32 tests. Change some functions to private functions of implementing classes, unavailable through the JNI macro assembler interface. Add some T32 tests for `MoveArguments()`. Add a TODO for using LDRD which should improve some @CriticalNative stubs. Remove unnecessary `#include`s of `jni_macro_assembler.h`. Test: m test-art-host-gtest Test: testrunner.py --host --optimizing Bug: 271573990 Change-Id: I65c14ba1cf8a50db80243aaaa96e85eb6a28477f
2022-11-09Make compiler/utils/ symbols hidden. Vladimir Marko
Test: m test-art-host-gtest Test: testrunner.py --host --optimizing Change-Id: I5e39375f16e0ff1372c35fda444a4ef33bf320bf
2022-11-04Update method exit hooks from JITed code to not use Stack visitor Mythri Alle
Using NthCallerStackVisitor is expensive since that involves decoding method header and other tasks that are reasonably expensive especially when called on every method exit. When calling method exit hooks from JITed code a lot of this information like the frame_size, calling method are already known and can be directly passed to the method exit hook instead of computing them. Locally this change improves the performance by 70% on debuggable-cc config of golem benchmarks. Bug: 253232638 Test: art/test.py Change-Id: I3a1d80748c6d85e5fa1d3bd4aec0b29962ba0156
2022-07-06Reland^2 "Don't use instrumentation stubs for native methods in debuggable" Mythri Alle
This reverts commit 1d1d25eea72cf22aed802352a82588d97403f7b6. Reason for revert: Relanding after fix to failures: https://android-review.googlesource.com/c/platform/cts/+/2145979 Bug: 206029744 Change-Id: Id3c7508c86f9aeb0ddfc1c4792ed54f003b88e77
2022-07-04Revert "Reland "Don't use instrumentation stubs for native methods in ↵ Mythri Alle
debuggable"" This reverts commit 6fb0acc14459a856c35b642e3368aff853259260. Reason for revert: Breaks android.jvmti.cts.JvmtiHostTest https://buganizer.corp.google.com/issues/237991413 Change-Id: I00fb58080693ddebc03c7b62ea67c91150ef7a21
2022-07-04Reland "Don't use instrumentation stubs for native methods in debuggable" Mythri Alle
This reverts commit 5c9b55aa95295a287abd86f1e7fbe98c3f35ffd6. Reason for revert: Relanding with fixes for failure Fixes: 1. Arm64 needs to use 64-bit registers 2. We cannot deoptimize directly from GenericJniEndTrampoline since we only have a refs and args frame. So call the method exit hooks from art_quick_generic_jni_trampoline. Change-Id: If1f08eca69626f60f42f10205b482a3764610846
2022-06-24Revert "Don't use instrumentation stubs for native methods in debuggable" Mythri Alle
This reverts commit 90f12677f80169dc3ef919c2067349f94b943e7f. Reason for revert: Failures on device https://ci.chromium.org/ui/p/art/builders/ci/angler-armv7-ndebug/3058/overview https://ci.chromium.org/ui/p/art/builders/ci/angler-armv8-ndebug/3049/overview Change-Id: I43f943f9180b8c76db02a2a5c228a209a2f18a82
2022-06-24Don't use instrumentation stubs for native methods in debuggable Mythri Alle
Don't install instrumentation stubs for native methods in debuggable runtimes. The GenericJniTrampoline is updated to call method entry / exit hooks. When JITing JNI stubs in debuggable runtimes we also include calls to method entry / exit hooks when required. Bug: 206029744 Test: art/test.py Change-Id: I1d92ddb1d03daed74d88f5c70d38427dc6055446
2022-05-14Reland^3 "Don't use AOT code for native methods for java debuggable runtime" Mythri Alle
This reverts commit fb1b08cbb9c6ac149d75de16c14fdaa8b68baaa4. Reason for revert: Reland after a fix. We had to update untagging in jni_dlsym_lookup_stub as well. Change-Id: Id936e9e60f9e87e96f1a9a79cd2118631ad1616b
2022-05-12Revert "Reland^2 "Don't use AOT code for native methods for java debuggable ↵ Mythri Alle
runtime"" This reverts commit 5da52cd20ea0d24b038ae20c6c96aa22ac3a24a0. Reason for revert: https://ci.chromium.org/ui/p/art/builders/ci/host-x86_64-cdex-fast/5172/overview Change-Id: I9cebbaa145810547531a90af9da7961c0b6255d1
2022-05-12Reland^2 "Don't use AOT code for native methods for java debuggable runtime" Mythri Alle
This reverts commit 570ade8a6600d368a9e24b64cfa0a1907929166a. Reason for revert: Relanding after a fix for failures. The original cl breaks the invariant that we would always use AOT code for native methods if there is AOT code. This invariant is necessary to get the header when walking the stack. This CL fixes it by not relying on the invariant but instead tagging the sp to differentiate between JIT and AOT code in debuggable runtimes. Non-debuggable runtimes still have the invariant. Change-Id: I5141281f04202d41988021d53bfe30a48bc4db9c
2022-02-07Remove unused function JNIMacroAssembler::Call(FrameOffset, Offset). Peter Collingbourne
Change-Id: I08c98f748c7b51ee5f58cbf9b56324a6ec3109a8
2021-12-14JNI: Inline fast-path for `JniMethodEnd()`. Vladimir Marko
Golem results for art-opt-cc (higher is better): linux-ia32 before after NativeDowncallStaticNormal 46.766 51.016 (+9.086%) NativeDowncallStaticNormal6 42.268 45.748 (+8.235%) NativeDowncallStaticNormalRefs6 41.355 44.776 (+8.272%) NativeDowncallVirtualNormal 46.361 52.527 (+13.30%) NativeDowncallVirtualNormal6 41.812 45.206 (+8.118%) NativeDowncallVirtualNormalRefs6 40.500 44.169 (+9.059%) (The NativeDowncallVirtualNormal result for x86 is skewed by one extra good run as Golem reports the best result in the summary. Using the second best and most frequent result 50.5, the improvement is only around 8.9%.) linux-x64 before after NativeDowncallStaticNormal 44.169 47.976 (+8.620%) NativeDowncallStaticNormal6 43.198 46.836 (+8.423%) NativeDowncallStaticNormalRefs6 38.481 44.687 (+16.13%) NativeDowncallVirtualNormal 43.672 47.405 (+8.547%) NativeDowncallVirtualNormal6 42.268 45.726 (+8.182%) NativeDowncallVirtualNormalRefs6 41.355 44.687 (+8.057%) (The NativeDowncallStaticNormalRefs6 result for x86-64 is a bit inflated because recent results jump between ~38.5 and ~40.5. If we take the latter as the baseline, the improvements is only around 10.3%.) linux-armv7 before after NativeDowncallStaticNormal 10.659 14.620 (+37.16%) NativeDowncallStaticNormal6 9.8377 13.120 (+33.36%) NativeDowncallStaticNormalRefs6 8.8714 11.454 (+29.11%) NativeDowncallVirtualNormal 10.511 14.349 (+36.51%) NativeDowncallVirtualNormal6 9.9701 13.347 (+33.87%) NativeDowncallVirtualNormalRefs6 8.9241 11.454 (+28.35%) linux-armv8 before after NativeDowncallStaticNormal 10.608 16.329 (+53.93%) NativeDowncallStaticNormal6 10.179 15.347 (+50.76%) NativeDowncallStaticNormalRefs6 9.2457 13.705 (+48.23%) NativeDowncallVirtualNormal 9.9850 14.903 (+49.25%) NativeDowncallVirtualNormal6 9.9206 14.757 (+48.75%) NativeDowncallVirtualNormalRefs6 8.8235 12.789 (+44.94%) Test: m test-art-host-gtest Test: testrunner.py --host --optimizing Test: run-gtests.sh Test: testrunner.py --target --optimizing Bug: 172332525 Change-Id: Ie144bc4f7f82be95790ea7d3123b81a3b6bfa603
2021-12-07JNI: Inline fast-path for `JniMethodStart()`. Vladimir Marko
Golem results for art-opt-cc (higher is better): linux-ia32 before after NativeDowncallStaticNormal 35.306 47.382 (+34.20%) NativeDowncallStaticNormal6 32.951 42.247 (+28.21%) NativeDowncallStaticNormalRefs6 17.866 41.355 (+131.5%) NativeDowncallVirtualNormal 35.341 46.836 (+32.53%) NativeDowncallVirtualNormal6 32.403 41.791 (+28.97%) NativeDowncallVirtualNormalRefs6 32.131 40.500 (+26.05%) linux-x64 before after NativeDowncallStaticNormal 33.350 43.716 (+31.08%) NativeDowncallStaticNormal6 31.096 43.176 (+38.85%) NativeDowncallStaticNormalRefs6 30.617 38.500 (+25.75%) NativeDowncallVirtualNormal 33.234 43.672 (+32.41%) NativeDowncallVirtualNormal6 30.617 42.247 (+37.98%) NativeDowncallVirtualNormalRefs6 32.131 42.701 (+32.90%) linux-armv7 before after NativeDowncallStaticNormal 7.8701 9.9651 (+26.62%) NativeDowncallStaticNormal6 7.4147 8.9463 (+20.66%) NativeDowncallStaticNormalRefs6 6.8830 8.3868 (+21.85%) NativeDowncallVirtualNormal 7.8316 9.8377 (+25.61%) NativeDowncallVirtualNormal6 7.4147 9.3596 (+26.23%) NativeDowncallVirtualNormalRefs6 6.6794 8.4325 (+26.25%) linux-armv8 before after NativeDowncallStaticNormal 7.6372 9.8571 (+29.07%) NativeDowncallStaticNormal6 7.4147 9.4905 (+28.00%) NativeDowncallStaticNormalRefs6 6.8527 8.6705 (+26.53%) NativeDowncallVirtualNormal 7.4147 9.3183 (+25.67%) NativeDowncallVirtualNormal6 7.0755 9.2593 (+30.86%) NativeDowncallVirtualNormalRefs6 6.5604 8.2967 (+26.47%) Note that NativeDowncallStaticNormalRefs6 on x86 has been jumping like crazy since https://android-review.googlesource.com/1905055 between ~17.6 and ~32.4 for completely unrelated changes, so if we take the 32.4 as a baseline, the improvement is only ~27.6% in line with the other x86 benchmarks. Test: m test-art-host-gtest Test: testrunner.py --host --optimizing Test: run-gtests.sh Test: testrunner.py --target --optimizing Bug: 172332525 Change-Id: I771a4765bd3a7c4e58b94be4155515241ea6fa3c
2021-11-10JNI: Move args in registers for @FastNative. Vladimir Marko
Golem results for art-opt-cc (higher is better): linux-ia32 before after NativeDowncallStaticFast 222.00 222.17 (+0.0751%) NativeDowncallStaticFast6 139.86 161.00 (+15.11%) NativeDowncallStaticFastRefs6 131.00 137.86 (+5.238%) NativeDowncallVirtualFast 211.79 217.17 (+2.543%) NativeDowncallVirtualFast6 137.36 150.55 (+9.599%) NativeDowncallVirtualFastRefs6 131.50 132.60 (+0.8382%) linux-x64 before after NativeDowncallStaticFast 173.15 173.24 (+0.0499%) NativeDowncallStaticFast6 135.50 157.61 (+16.31%) NativeDowncallStaticFastRefs6 127.06 134.87 (+6.147%) NativeDowncallVirtualFast 163.67 165.83 (+1.321%) NativeDowncallVirtualFast6 128.18 147.35 (+14.96%) NativeDowncallVirtualFastRefs6 123.44 130.74 (+5.914%) linux-armv7 before after NativeDowncallStaticFast 21.622 21.622 (0%) NativeDowncallStaticFast6 17.250 18.719 (+8.518%) NativeDowncallStaticFastRefs6 14.757 15.663 (+6.145%) NativeDowncallVirtualFast 21.027 21.319 (+1.388%) NativeDowncallVirtualFast6 17.439 18.953 (+8.680%) NativeDowncallVirtualFastRefs6 14.764 15.992 (+8.319%) linux-armv8 before after NativeDowncallStaticFast 23.244 23.610 (+1.575%) NativeDowncallStaticFast6 18.719 21.622 (+15.50%) NativeDowncallStaticFastRefs6 14.757 18.491 (+20.89%) NativeDowncallVirtualFast 20.197 21.319 (+5.554%) NativeDowncallVirtualFast6 18.272 21.027 (+15.08%) NativeDowncallVirtualFastRefs6 13.951 16.865 (+20.89%) (The arm64 NativeDowncallVirtualFast reference value is very low, resulting in an unexpected +5.554% improvement. As the previous results seem to jump between 20.197 and 20.741, the actual improvement is probably just around 2.5%.) Test: m test-art-host-gtest Test: testrunner.py --host --optimizing Test: run-gtests.sh Test: testrunner.py --target --optimizing Bug: 172332525 Change-Id: I2b596414458b48a758826eafc223529e9f2fe059
2021-11-08JNI: Rewrite read barrier slow path. Vladimir Marko
Preserve all argument registers in the slow path to prepare for moving arguments in registers for @FastNative. Move the read barrier check earlier as it logically belongs to the transition frame creation. For Baker read barriers, add a mark bit check with fast return to the main path. Test: m test-art-host-gtest Test: testrunner.py --host --optimizing Test: run-gtests.sh Test: testrunner.py --target --optimizing Bug: 172332525 Change-Id: I50bbc0bc9d54577281e7667aafebb4a53a539af1
2021-11-02Revert^2 "JNI: Remove `JniMethodFast{Start,End}()`." Vladimir Marko
This reverts commit 2ca0900e98d826644960eefeb8a21c84850c9e04. Reason for revert: Fixed instrumentation for suspend check from JNI stub, added a commented-out DCHECK() and a test. The commented-out DCHECK() was correctly catching the bug with the original submission but it also exposed deeper issues with the instrumentation framework, so we cannot fully enable it - bug 204766614 has been filed for this. Original message: Inline suspend check from `GoToRunnableFast()` to JNI stubs. The only remaining code in `JniMethodFast{Start,End}()` is a debug mode check that the method is @FastNative, so remove the call altogether as we prefer better performance over the debug mode check. Replace `JniMethodFastEndWithReference()` with a simple `JniDecodeReferenceResult()`. Golem results for art-opt-cc (higher is better): linux-ia32 before after NativeDowncallStaticFast 149.00 226.77 (+52.20%) NativeDowncallStaticFast6 107.39 140.29 (+30.63%) NativeDowncallStaticFastRefs6 104.50 130.54 (+24.92%) NativeDowncallVirtualFast 147.28 207.09 (+40.61%) NativeDowncallVirtualFast6 106.39 136.93 (+28.70%) NativeDowncallVirtualFastRefs6 104.50 130.54 (+24.92%) linux-x64 before after NativeDowncallStaticFast 133.10 173.50 (+30.35%) NativeDowncallStaticFast6 109.12 135.73 (+24.39%) NativeDowncallStaticFastRefs6 105.29 127.18 (+20.79%) NativeDowncallVirtualFast 127.74 167.66 (+31.25%) NativeDowncallVirtualFast6 106.39 128.12 (+20.42%) NativeDowncallVirtualFastRefs6 105.29 127.18 (+20.79%) linux-armv7 before after NativeDowncallStaticFast 18.058 21.622 (+19.74%) NativeDowncallStaticFast6 14.903 17.057 (+14.45%) NativeDowncallStaticFastRefs6 13.006 14.620 (+12.41%) NativeDowncallVirtualFast 17.848 21.027 (+17.81%) NativeDowncallVirtualFast6 15.196 17.439 (+14.76%) NativeDowncallVirtualFastRefs6 12.897 14.764 (+14.48%) linux-armv8 before after NativeDowncallStaticFast 19.183 23.610 (+23.08%) NativeDowncallStaticFast6 16.161 19.183 (+18.71%) NativeDowncallStaticFastRefs6 13.235 15.041 (+13.64%) NativeDowncallVirtualFast 17.839 20.741 (+16.26%) NativeDowncallVirtualFast6 15.500 18.272 (+17.88%) NativeDowncallVirtualFastRefs6 12.481 14.209 (+13.84%) Test: m test-art-host-gtest Test: testrunner.py --host --optimizing Test: run-gtests.sh Test: testrunner.py --target --optimizing Test: testrunner.py --host --jit --no-image Test: testrunner.py --host --optimizing --debuggable -t 2005 Bug: 172332525 Bug: 204766614 Change-Id: I9cc7583fc11c457a53fe2d1a24a8befc0f36410d
2021-10-19Revert "JNI: Remove `JniMethodFast{Start,End}()`." Vladimir Marko
This reverts commit 64d6e187f19ed670429652020561887e6b220216. Reason for revert: Breaks no-image JIT run tests (flaky). Bug: 172332525 Change-Id: I7813d89283eff0f6266318d3fb02d1257471798d
2021-10-19JNI: Remove `JniMethodFast{Start,End}()`. Vladimir Marko
Inline suspend check from `GoToRunnableFast()` to JNI stubs. The only remaining code in `JniMethodFast{Start,End}()` is a debug mode check that the method is @FastNative, so remove the call altogether as we prefer better performance over the debug mode check. Replace `JniMethodFastEndWithReference()` with a simple `JniDecodeReferenceResult()`. Golem results for art-opt-cc (higher is better): linux-ia32 before after NativeDowncallStaticFast 149.00 226.77 (+52.20%) NativeDowncallStaticFast6 107.39 140.29 (+30.63%) NativeDowncallStaticFastRefs6 104.50 130.54 (+24.92%) NativeDowncallVirtualFast 147.28 207.09 (+40.61%) NativeDowncallVirtualFast6 106.39 136.93 (+28.70%) NativeDowncallVirtualFastRefs6 104.50 130.54 (+24.92%) linux-x64 before after NativeDowncallStaticFast 133.10 173.50 (+30.35%) NativeDowncallStaticFast6 109.12 135.73 (+24.39%) NativeDowncallStaticFastRefs6 105.29 127.18 (+20.79%) NativeDowncallVirtualFast 127.74 167.66 (+31.25%) NativeDowncallVirtualFast6 106.39 128.12 (+20.42%) NativeDowncallVirtualFastRefs6 105.29 127.18 (+20.79%) linux-armv7 before after NativeDowncallStaticFast 18.058 21.622 (+19.74%) NativeDowncallStaticFast6 14.903 17.057 (+14.45%) NativeDowncallStaticFastRefs6 13.006 14.620 (+12.41%) NativeDowncallVirtualFast 17.848 21.027 (+17.81%) NativeDowncallVirtualFast6 15.196 17.439 (+14.76%) NativeDowncallVirtualFastRefs6 12.897 14.764 (+14.48%) linux-armv8 before after NativeDowncallStaticFast 19.183 23.610 (+23.08%) NativeDowncallStaticFast6 16.161 19.183 (+18.71%) NativeDowncallStaticFastRefs6 13.235 15.041 (+13.64%) NativeDowncallVirtualFast 17.839 20.741 (+16.26%) NativeDowncallVirtualFast6 15.500 18.272 (+17.88%) NativeDowncallVirtualFastRefs6 12.481 14.209 (+13.84%) Test: m test-art-host-gtest Test: testrunner.py --host --optimizing Test: run-gtests.sh Test: testrunner.py --target --optimizing Bug: 172332525 Change-Id: I680aaeaa0c1a55796271328180e9d4ed7d89c0b8
2021-10-18JNI compiler: Rewrite exception polling. Vladimir Marko
Make the slow path explicit in the JNI compiler. Fix the CFI data for the exceptional path of synchronized methods. Test: m test-art-host-gtest Test: testrunner.py --host --optimizing Test: run-gtests.sh Test: testrunner.py --target --optimizing Bug: 172332525 Change-Id: If64965eef15c063e36b78dd8bb6cba5af34ab4fa
2021-10-11Inline IRT frame push/pop into JNI stubs. Vladimir Marko
Golem results for art-opt-cc (higher is better): linux-ia32 before after NativeDowncallStaticNormal 25.704 26.839 (+4.414%) NativeDowncallStaticNormal6 23.857 25.086 (+5.152%) NativeDowncallStaticNormalRefs6 23.704 25.248 (+6.513%) NativeDowncallVirtualNormal 25.578 27.000 (+5.560%) NativeDowncallVirtualNormal6 23.704 24.925 (+5.153%) NativeDowncallVirtualNormalRefs6 23.704 25.074 (+5.870%) NativeDowncallStaticFast 100.65 149.13 (+48.17%) NativeDowncallStaticFast6 78.304 107.39 (+37.71%) NativeDowncallStaticFastRefs6 76.962 104.45 (+35.71%) NativeDowncallVirtualFast 100.40 147.28 (+46.69%) NativeDowncallVirtualFast6 79.302 106.34 (+34.10%) NativeDowncallVirtualFastRef26 76.617 103.29 (+34.82%) linux-x64 before after NativeDowncallStaticNormal 26.083 26.987 (+3.465%) NativeDowncallStaticNormal6 24.606 25.411 (+3.271%) NativeDowncallStaticNormalRefs6 24.150 25.086 (+3.877%) NativeDowncallVirtualNormal 25.743 26.812 (+4.156%) NativeDowncallVirtualNormal6 24.294 25.248 (+3.927%) NativeDowncallVirtualNormalRefs6 23.857 25.086 (+5.152%) NativeDowncallStaticFast 109.95 133.10 (+21.06%) NativeDowncallStaticFast6 90.274 109.12 (+20.87%) NativeDowncallStaticFastRefs6 87.282 105.29 (+20.63%) NativeDowncallVirtualFast 104.00 127.55 (+22.65%) NativeDowncallVirtualFast6 88.191 106.73 (+21.02%) NativeDowncallVirtualFastRef26 85.530 102.09 (+19.36%) linux-armv7 before after NativeDowncallStaticNormal 6.1148 6.3694 (+4.316%) NativeDowncallStaticNormal6 5.6845 5.9026 (+3.837%) NativeDowncallStaticNormalRefs6 5.4054 5.6022 (+3.641%) NativeDowncallVirtualNormal 5.4726 5.7088 (+4.316%) NativeDowncallVirtualNormal6 5.1789 5.3685 (+3.660%) NativeDowncallVirtualNormalRefs6 4.9140 5.0902 (+3.586%) NativeDowncallStaticFast 16.683 18.058 (+8.239%) NativeDowncallStaticFast6 13.951 14.896 (+6.770%) NativeDowncallStaticFastRefs6 12.279 13.006 (+5.919%) NativeDowncallVirtualFast 16.161 17.848 (+10.44%) NativeDowncallVirtualFast6 14.085 15.196 (+7.892%) NativeDowncallVirtualFastRef26 12.089 12.897 (+6.683%) linux-armv8 before after NativeDowncallStaticNormal 6.0663 6.4229 (+5.879%) NativeDowncallStaticNormal6 5.7252 6.0437 (+5.563%) NativeDowncallStaticNormalRefs6 5.3114 5.5814 (+5.082%) NativeDowncallVirtualNormal 5.8795 6.2651 (+6.558%) NativeDowncallVirtualNormal6 5.6232 5.9494 (+5.801%) NativeDowncallVirtualNormalRefs6 5.1862 5.4429 (+4.948%) NativeDowncallStaticFast 17.638 19.183 (+8.760%) NativeDowncallStaticFast6 14.903 16.161 (+8.438%) NativeDowncallStaticFastRefs6 12.475 13.235 (+6.094%) NativeDowncallVirtualFast 15.826 17.848 (+12.78%) NativeDowncallVirtualFast6 14.064 15.504 (+10.24%) NativeDowncallVirtualFastRef26 11.628 12.475 (+7.285%) Test: m test-art-host-gtest Test: testrunner.py --host --optimizing Test: run-gtests.sh Test: testrunner.py --target --optimizing Bug: 172332525 Change-Id: I5ecfa7a661f08ab63dd2a75d666e1c1b9121935f
2021-02-23Do not create HandleScope for JNI transitions. Vladimir Marko
We previously crated a HandleScope in the JNI transition frame to hold references passed as jobject (jclass, etc.) to the native function and these references were actually spilled twice during the transition. We now construct the jobject as a pointer to the reference spilled in the reserved out vreg area in the caller's frame. And the jclass for static methods is just a pointer to the method's declaring class. This reduces the amount of work required in the JNI transition, both on entry (in compiled stubs) and exit (in JniMethodEnd*). Some additional work is required when GC visits references of a native method as we need to walk over the method's shorty which was unnecessary for a HandleScope. Also fix Thread::InitStackHwm() to calculate correct stack size needed by the new Thread::IsJniTransitionReference(). The results for StringToBytesBenchmark on blueline little cores running at fixed frequency 1420800 are approximately arm64 (medians from 3 runs) before after timeGetBytesAscii EMPTY 447.33 436.86 timeGetBytesIso88591 EMPTY 440.52 431.13 timeGetBytesUtf8 EMPTY 432.31 409.82 arm (medians from 3 runs) before after timeGetBytesAscii EMPTY 500.53 490.87 timeGetBytesIso88591 EMPTY 496.45 495.30 timeGetBytesUtf8 EMPTY 488.84 472.68 Test: m test-art-host-gtest Test: testrunner.py --host Test: testrunner.py --host --gcstress Test: testrunner.py --host --jit-on-first-use Test: testrunner.py --host --jit-on-first-use --gcstress Test: run-gtests.sh Test: testrunner.py --target --optimizing Test: boots. Bug: 172332525 Change-Id: I658f9d87071587b3e89f31c65feca976a11e9cc2
2020-03-16Move @CriticalNative arguments in registers. Vladimir Marko
And spill stack arguments directly to the right location. Do not spill to the reserved space in the caller's frame. Preliminary Golem results for art-opt-cc: x86 x86-64 arm arm64 NativeDowncallCritical6: n/a +14.3% +17.2% +26.1% (x86 seems to be currently providing results that are worse than interpreter, so something is not working.) Test: Additional tests in 178-app-image-native-method test. Test: m test-art-host-gtest Test: testrunner.py --host --optimizing Test: aosp_taimen-userdebug boots. Test: run-gtests.sh Test: testrunner.py --target --optimizing Bug: 112189621 Change-Id: I709c52ab2585a8f5f441f53ad2bf4a01d2b25dca
2020-03-02Move entry spills determination to JNI compiler. Vladimir Marko
The calling convention no longer describes entry spills as spilling is the JNI compiler's responsibility. This allows future improvements, such as spilling registers directly to the HandleScope or outgoing stack args. Remove the notion of interprocedural scratch register from calling conventions and let assemblers deal with all scratch register uses. The remaining JNI assembler APIs that take scratch registers are currently unused and can be removed. Also fix a bug in disassembly comparison for tests; the contents of two files were considered identical if the second one just contained additional data. This change fully preserves the generated code and adds TODO comments where doing so results in weird or suboptimal code. Test: m test-art-host-gtest Test: testrunner.py --host --optimizing Test: Prebuilt boot image is unchanged. Test: aosp_taimen-userdebug boots. Bug: 12189621 Change-Id: Ic26a670276920313cd907a6eda8d982cf0abfd81
2020-01-16jni: Do not create a managed frame for @CriticalNative. Vladimir Marko
Omit managed frame for @CriticalNative methods, do not check for exceptions and and make a tail call when possible. Pass the method pointer in a hidden argument to prepare for implementing late binding for @CriticalNative methods. This changes only the JNI compiler, Generic JNI shall be updated in a separate change. Performance improvements reported by Golem (art-opt-cc): x86 x86-64 arm arm64 NativeDowncallStaticCritical6 +17% +50% +88% +139% NativeDowncallStaticCritical +37% +32% +103% +216% Test: m test-art-host-gtest Test: testrunner.py --host --optimizing Test: aosp_taimen-userdebug boots. Test: run-gtests.sh Test: testrunner.py --target --optimizing Bug: 112189621 Change-Id: I5758c8f478627f2eee8f615b4537a907c211b9f8
2018-08-28Remove superfluous 'virtual' specifiers in ART. Roland Levillain
Remove 'virtual' specifier on methods already bearing the 'override' specifier. Test: mmma art Change-Id: I114930969a5ca048d88de9ecd18e2c6403593e31
2018-08-28Use 'final' and 'override' specifiers directly in ART. Roland Levillain
Remove all uses of macros 'FINAL' and 'OVERRIDE' and replace them with 'final' and 'override' specifiers. Remove all definitions of these macros as well, which were located in these files: - libartbase/base/macros.h - test/913-heaps/heaps.cc - test/ti-agent/ti_macros.h ART is now using C++14; the 'final' and 'override' specifiers have been introduced in C++11. Test: mmma art Change-Id: I256c7758155a71a2940ef2574925a44076feeebf
2017-12-07ART: Replace base/logging with android-base/logging Andreas Gampe
Replace wherever possible. ART's base/logging is now mainly VLOG and initialization code that is unnecessary to pull in and makes changes to verbose logging more painful than they have to be. Test: m test-art-host Change-Id: I3e3a4672ba5b621e57590a526c7d1c8b749e4f6e
2017-10-09Use ScopedArenaAllocator for register allocation. Vladimir Marko
Memory needed to compile the two most expensive methods for aosp_angler-userdebug boot image: BatteryStats.dumpCheckinLocked() : 25.1MiB -> 21.1MiB BatteryStats.dumpLocked(): 49.6MiB -> 42.0MiB This is because all the memory previously used by Scheduler is reused by the register allocator; the register allocator has a higher peak usage of the ArenaStack. And continue the "arena"->"allocator" renaming. Test: m test-art-host-gtest Test: testrunner.py --host Bug: 64312607 Change-Id: Idfd79a9901552b5147ec0bf591cb38120de86b01
2017-10-04Do not refresh the Marking Register in CriticalNative methods. Roland Levillain
CriticalNative methods shall not be suspended and hence do not require MR to be refreshed in compiled JNI code. This change is for ARM and ARM64 only. Impact on Critical Native benchmarks times (median of 10 runs, lower is better): * angler-userdebug - ARMv7 ** All cores NativeDowncallStaticCritical -2.78% NativeDowncallStaticCritical6 -1.79% ** Little cores only NativeDowncallStaticCritical -1.66% NativeDowncallStaticCritical6 -1.27% ** Big cores only NativeDowncallStaticCritical -2.66% NativeDowncallStaticCritical6 -1.70% * angler-userdebug - ARMv8 ** All cores NativeDowncallStaticCritical -3.52% NativeDowncallStaticCritical6 -1.79% ** Little cores only NativeDowncallStaticCritical -1.63% NativeDowncallStaticCritical6 -1.27% ** Big cores only NativeDowncallStaticCritical -3.87% NativeDowncallStaticCritical6 -1.75% Test: m test-art-target Test: m test-art-target with tree built with ART_USE_READ_BARRIER=false Test: m test-art-host-gtest Test: ARM64 device boot test Test: ARM device boot test Bug: b/37707231 Change-Id: I95d61b9ecde0afffdd5fd44763b19caa06025ec8
2017-08-10Instrument ARM64 generated code to check the Marking Register. Roland Levillain
Generate run-time code in the Optimizing compiler checking that the Marking Register's value matches `self.tls32_.is.gc_marking` in debug mode (on target; and on host with JIT, or with AOT when compiling the core image). If a check fails, abort. Test: m test-art-target Test: m test-art-target with tree built with ART_USE_READ_BARRIER=false Test: ARM64 device boot test with libartd. Bug: 37707231 Change-Id: Ie9b322b22b3d26654a06821e1db71dbda3c43061
2016-10-13jni: Add read barrier fast path to jni compiler Igor Murashkin
Static method dispatch via JNI requires a read barrier for the ArtMethod::GetDeclaringClass() load before adding it to the JNI StackHandleScope. We used to call ReadBarrierJni unconditionally but add a branch to skip calling it if the GC is not currently in the marking phase. Test: ART_USE_READ_BARRIER=true make test-art-host test-art-target Bug: 30437917 Change-Id: I4f505ebde17c0a67209c7bb51b3f39e37a06373a
2016-09-14Move ArrayRef to runtime/base David Brazdil
Will be used in upcoming CLs regarding VDEX and VerifierDeps. Test: m test-art-host Change-Id: I68e611a4a52246c2bdf45eab7c61f3212908afd4
2016-08-05ART: Extract macro assembler Andreas Gampe
Extract macro assembler functionality used by the JNI compiler from the assembler interface. Templatize the new interface so that type safety ensures correct usage. Change-Id: Idb9f56e5b87e43ee6a7378853d8a9f01abe156b2 Test: m test-art-host