Mercurial > hg > graal-jvmci-8
changeset 23986:6d2c72b822b0
add ResolvedJavaMethod.hasNeverInlineDirective (JDK-8172733)
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Tue, 24 Jan 2017 13:03:27 +0100 |
parents | 05922ce51c5e |
children | 33421fb951da |
files | jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/CompilerToVM.java jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethod.java jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java jvmci/jdk.vm.ci.meta/src/jdk/vm/ci/meta/ResolvedJavaMethod.java jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/TestResolvedJavaMethod.java src/share/vm/jvmci/jvmciCompilerToVM.cpp |
diffstat | 6 files changed, 37 insertions(+), 31 deletions(-) [+] |
line wrap: on
line diff
--- a/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/CompilerToVM.java Mon Jan 23 15:50:05 2017 -0800 +++ b/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/CompilerToVM.java Tue Jan 24 13:03:27 2017 +0100 @@ -101,15 +101,19 @@ native long getExceptionTableStart(HotSpotResolvedJavaMethodImpl method); /** - * Determines if {@code method} can be inlined. A method may not be inlinable for a number of - * reasons such as: - * <ul> - * <li>a CompileOracle directive may prevent inlining or compilation of methods</li> - * <li>the method may have a bytecode breakpoint set</li> - * <li>the method may have other bytecode features that require special handling by the VM</li> - * </ul> + * Determines whether {@code method} is currently compilable by the JVMCI compiler being used by + * the VM. This can return false if JVMCI compilation failed earlier for {@code method}, a + * breakpoint is currently set in {@code method} or {@code method} contains other bytecode + * features that require special handling by the VM. */ - native boolean canInlineMethod(HotSpotResolvedJavaMethodImpl method); + native boolean isCompilable(HotSpotResolvedJavaMethodImpl method); + + /** + * Determines if {@code method} is targeted by a VM directive (e.g., + * {@code -XX:CompileCommand=dontinline,<pattern>}) or annotation (e.g., + * {@code jdk.internal.vm.annotation.DontInline}) that specifies it should not be inlined. + */ + native boolean hasNeverInlineDirective(HotSpotResolvedJavaMethodImpl method); /** * Determines if {@code method} should be inlined at any cost. This could be because:
--- a/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethod.java Mon Jan 23 15:50:05 2017 -0800 +++ b/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethod.java Tue Jan 24 13:03:27 2017 +0100 @@ -50,13 +50,6 @@ boolean isForceInline(); /** - * Returns true if this method has a {@code DontInline} annotation. - * - * @return true if DontInline annotation present, false otherwise - */ - boolean isDontInline(); - - /** * Returns true if this method has a {@code ReservedStackAccess} annotation. * * @return true if ReservedStackAccess annotation present, false otherwise
--- a/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java Mon Jan 23 15:50:05 2017 -0800 +++ b/jvmci/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl.java Tue Jan 24 13:03:27 2017 +0100 @@ -300,15 +300,6 @@ } /** - * Returns true if this method has a {@code DontInline} annotation. - * - * @return true if DontInline annotation present, false otherwise - */ - public boolean isDontInline() { - return (getFlags() & config().methodFlagsDontInline) != 0; - } - - /** * Returns true if this method has a {@code ReservedStackAccess} annotation. * * @return true if ReservedStackAccess annotation present, false otherwise @@ -584,10 +575,15 @@ @Override public boolean canBeInlined() { - if (isDontInline()) { + if (hasNeverInlineDirective()) { return false; } - return compilerToVM().canInlineMethod(this); + return compilerToVM().isCompilable(this); + } + + @Override + public boolean hasNeverInlineDirective() { + return compilerToVM().hasNeverInlineDirective(this); } @Override
--- a/jvmci/jdk.vm.ci.meta/src/jdk/vm/ci/meta/ResolvedJavaMethod.java Mon Jan 23 15:50:05 2017 -0800 +++ b/jvmci/jdk.vm.ci.meta/src/jdk/vm/ci/meta/ResolvedJavaMethod.java Tue Jan 24 13:03:27 2017 +0100 @@ -347,6 +347,13 @@ boolean canBeInlined(); /** + * Determines if this method is targeted by a VM directive (e.g., + * {@code -XX:CompileCommand=dontinline,<pattern>}) or VM recognized annotation (e.g., + * {@code jdk.internal.vm.annotation.DontInline}) that specifies it should not be inlined. + */ + boolean hasNeverInlineDirective(); + + /** * Returns {@code true} if the inlining of this method should be forced. */ boolean shouldBeInlined();
--- a/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/TestResolvedJavaMethod.java Mon Jan 23 15:50:05 2017 -0800 +++ b/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/TestResolvedJavaMethod.java Tue Jan 24 13:03:27 2017 +0100 @@ -446,6 +446,7 @@ "getProfilingInfo", "reprofile", "getCompilerStorage", + "hasNeverInlineDirective", "canBeInlined", "shouldBeInlined", "getLineNumberTable",
--- a/src/share/vm/jvmci/jvmciCompilerToVM.cpp Mon Jan 23 15:50:05 2017 -0800 +++ b/src/share/vm/jvmci/jvmciCompilerToVM.cpp Tue Jan 24 13:03:27 2017 +0100 @@ -582,12 +582,16 @@ return method->is_ignored_by_security_stack_walk(); C2V_END -C2V_VMENTRY(jboolean, canInlineMethod,(JNIEnv *, jobject, jobject jvmci_method)) +C2V_VMENTRY(jboolean, isCompilable,(JNIEnv *, jobject, jobject jvmci_method)) methodHandle method = CompilerToVM::asMethod(jvmci_method); - // In hosted mode ignore the not_compilable flags since they are never set by + // Ignore the not_compilable flags in hosted mode since they are never set by // the JVMCI compiler. - bool is_compilable = UseJVMCICompiler ? !method->is_not_compilable(CompLevel_full_optimization) : true; - return is_compilable && !CompilerOracle::should_not_inline(method) && !method->dont_inline(); + return UseJVMCICompiler || !method->is_not_compilable(CompLevel_full_optimization); +C2V_END + +C2V_VMENTRY(jboolean, hasNeverInlineDirective,(JNIEnv *, jobject, jobject jvmci_method)) + methodHandle method = CompilerToVM::asMethod(jvmci_method); + return CompilerOracle::should_not_inline(method) || method->dont_inline(); C2V_END C2V_VMENTRY(jboolean, shouldInlineMethod,(JNIEnv *, jobject, jobject jvmci_method)) @@ -1515,7 +1519,8 @@ {CC"getStackTraceElement", CC"("HS_RESOLVED_METHOD"I)"STACK_TRACE_ELEMENT, FN_PTR(getStackTraceElement)}, {CC"methodIsIgnoredBySecurityStackWalk", CC"("HS_RESOLVED_METHOD")Z", FN_PTR(methodIsIgnoredBySecurityStackWalk)}, {CC"doNotInlineOrCompile", CC"("HS_RESOLVED_METHOD")V", FN_PTR(doNotInlineOrCompile)}, - {CC"canInlineMethod", CC"("HS_RESOLVED_METHOD")Z", FN_PTR(canInlineMethod)}, + {CC"isCompilable", CC"(" HS_RESOLVED_METHOD ")Z", FN_PTR(isCompilable)}, + {CC"hasNeverInlineDirective", CC"(" HS_RESOLVED_METHOD ")Z", FN_PTR(hasNeverInlineDirective)}, {CC"shouldInlineMethod", CC"("HS_RESOLVED_METHOD")Z", FN_PTR(shouldInlineMethod)}, {CC"lookupType", CC"("STRING CLASS"Z)"HS_RESOLVED_KLASS, FN_PTR(lookupType)}, {CC"lookupNameInPool", CC"("HS_CONSTANT_POOL"I)"STRING, FN_PTR(lookupNameInPool)},