summaryrefslogtreecommitdiff
path: root/compiler/optimizing/intrinsics_utils.h
diff options
context:
space:
mode:
author Vladimir Marko <vmarko@google.com> 2020-05-11 16:55:55 +0100
committer Vladimir Marko <vmarko@google.com> 2020-06-19 08:26:46 +0000
commit86c8752f64629325026945cd4eabd1dcea224acb (patch)
tree9dc2be978f9e784a3ce16fa29d46941a94ac1c94 /compiler/optimizing/intrinsics_utils.h
parentf97a859e85f703644d897f0e3e1bc54315557aaa (diff)
Direct calls to @CriticalNative methods.
Emit direct calls from compiled managed code to the native code registered with the method, avoiding the JNI stub. Golem results: art-opt-cc x86 x86-64 arm arm64 NativeDowncallStaticCritical +12.5% +62.5% +75.9% +41.7% NativeDowncallStaticCritical6 +55.6% +87.5% +72.1% +35.3% art-opt x86 x86-64 arm arm64 NativeDowncallStaticCritical +28.6% +85.6% +76.4% +38.4% NativeDowncallStaticCritical6 +44.6% +44.6% +74.6% +32.2% Test: Covered by 178-app-image-native-method. Test: m test-art-host-gtest Test: testrunner.py --host --debuggable --ndebuggable \ --optimizing --jit --jit-on-first-use Test: run-gtests.sh Test: testrunner.py --target --optimizing Test: testrunner.py --target --debuggable --ndebuggable \ --optimizing --jit --jit-on-first-use -t 178 Test: aosp_cf_x86_phone-userdebug boots. Test: aosp_cf_x86_phone-userdebug/jitzygote boots. Bug: 112189621 Change-Id: I8b37da51e8fe0b7bc513bb81b127fe0416068866
Diffstat (limited to 'compiler/optimizing/intrinsics_utils.h')
-rw-r--r--compiler/optimizing/intrinsics_utils.h7
1 files changed, 6 insertions, 1 deletions
diff --git a/compiler/optimizing/intrinsics_utils.h b/compiler/optimizing/intrinsics_utils.h
index e24d541c96..29f815c1be 100644
--- a/compiler/optimizing/intrinsics_utils.h
+++ b/compiler/optimizing/intrinsics_utils.h
@@ -59,7 +59,12 @@ class IntrinsicSlowPath : public TSlowPathCode {
Location method_loc = MoveArguments(codegen);
if (invoke_->IsInvokeStaticOrDirect()) {
- codegen->GenerateStaticOrDirectCall(invoke_->AsInvokeStaticOrDirect(), method_loc, this);
+ HInvokeStaticOrDirect* invoke_static_or_direct = invoke_->AsInvokeStaticOrDirect();
+ DCHECK_NE(invoke_static_or_direct->GetMethodLoadKind(),
+ HInvokeStaticOrDirect::MethodLoadKind::kRecursive);
+ DCHECK_NE(invoke_static_or_direct->GetCodePtrLocation(),
+ HInvokeStaticOrDirect::CodePtrLocation::kCallCriticalNative);
+ codegen->GenerateStaticOrDirectCall(invoke_static_or_direct, method_loc, this);
} else {
codegen->GenerateVirtualCall(invoke_->AsInvokeVirtual(), method_loc, this);
}