Skip to content

Commit 1e37fb4

Browse files
committed
[GR-69188] Implement HostCompilerDirectives.InliningRoot and increase exploration budget and maximum subtree invokes for the host inlining heuristic.
PullRequest: graal/22012
2 parents d45cb82 + f135f28 commit 1e37fb4

File tree

33 files changed

+500
-70
lines changed

33 files changed

+500
-70
lines changed

compiler/src/jdk.graal.compiler.libgraal/src/jdk/graal/compiler/libgraal/truffle/LibGraalTruffleHostEnvironment.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ protected HostMethodInfo computeValue(ResolvedJavaMethod method) {
106106
boolean isBytecodeInterpreterSwitch = false;
107107
boolean isBytecodeInterpreterSwitchBoundary = false;
108108
boolean isInliningCutoff = false;
109+
boolean isInliningRoot = false;
109110
for (AnnotationData annotationData : annotationDataList) {
110111
String annotationTypeFqn = annotationData.getAnnotationType().getName();
111112
if (hostTypes.TruffleBoundary.getName().equals(annotationTypeFqn)) {
@@ -116,9 +117,11 @@ protected HostMethodInfo computeValue(ResolvedJavaMethod method) {
116117
isBytecodeInterpreterSwitchBoundary = true;
117118
} else if (hostTypes.InliningCutoff.getName().equals(annotationTypeFqn)) {
118119
isInliningCutoff = true;
120+
} else if (hostTypes.InliningRoot != null && hostTypes.InliningRoot.getName().equals(annotationTypeFqn)) {
121+
isInliningRoot = true;
119122
}
120123
}
121-
return new HostMethodInfo(isTruffleBoundary, isBytecodeInterpreterSwitch, isBytecodeInterpreterSwitchBoundary, isInliningCutoff);
124+
return new HostMethodInfo(isTruffleBoundary, isBytecodeInterpreterSwitch, isBytecodeInterpreterSwitchBoundary, isInliningCutoff, isInliningRoot);
122125
}
123126

124127
}

compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/truffle/test/HostInliningTest.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
5050
import com.oracle.truffle.api.HostCompilerDirectives.BytecodeInterpreterSwitch;
5151
import com.oracle.truffle.api.HostCompilerDirectives.InliningCutoff;
52+
import com.oracle.truffle.api.HostCompilerDirectives.InliningRoot;
5253
import com.oracle.truffle.api.Truffle;
5354
import com.oracle.truffle.api.dsl.Cached;
5455
import com.oracle.truffle.api.dsl.ImplicitCast;
@@ -150,13 +151,14 @@ public void test() {
150151
runTest("testImplicitCast");
151152
runTest("testNativeCall");
152153
runTest("testBCDSLPrologIfVersion");
154+
runTest("testInliningRoot");
153155
}
154156

155157
/*
156158
* Test for GR-69170
157159
*/
158160
@BytecodeInterpreterSwitch
159-
static Object testBCDSLPrologIfVersion(int value) {
161+
static Object testBCDSLPrologIfVersion(@SuppressWarnings("unused") int value) {
160162
Object o = null;
161163
if (!CompilerDirectives.inInterpreter() && CompilerDirectives.hasNextTier()) {
162164
GraalDirectives.deoptimize();
@@ -1002,6 +1004,13 @@ static int testIndirectIntrinsicsImpl(A a) {
10021004
return a.intrinsic(); // inlined and intrinsic
10031005
}
10041006

1007+
@InliningRoot
1008+
static int testInliningRoot(int value) {
1009+
// should work just like bytecode interpreter switches
1010+
trivialMethod();
1011+
return value;
1012+
}
1013+
10051014
@Retention(RetentionPolicy.RUNTIME)
10061015
@Target(ElementType.METHOD)
10071016
@interface ExpectSameGraph {

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/host/HostInliningPhase.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ public static class Options {
106106
@Option(help = "Maximum budget for Truffle host inlining for runtime compiled methods.")//
107107
public static final OptionKey<Integer> TruffleHostInliningBaseBudget = new OptionKey<>(5_000);
108108

109+
@Option(help = "Maximum exploration budget for Truffle host inlining when exploring inlining candidates.")//
110+
public static final OptionKey<Integer> TruffleHostInliningExploreBudget = new OptionKey<>(10_000);
111+
109112
@Option(help = "Maximum budget for Truffle host inlining for runtime compiled methods with a BytecodeInterpreterSwitch annotation.")//
110113
public static final OptionKey<Integer> TruffleHostInliningByteCodeInterpreterBudget = new OptionKey<>(100_000);
111114

@@ -116,7 +119,7 @@ public static class Options {
116119
public static final OptionKey<Integer> TruffleHostInliningMaxExplorationDepth = new OptionKey<>(1000);
117120

118121
@Option(help = "Maximum number of subtree invokes for a subtree to get inlined until it is considered too complex.")//
119-
public static final OptionKey<Integer> TruffleHostInliningMaxSubtreeInvokes = new OptionKey<>(20);
122+
public static final OptionKey<Integer> TruffleHostInliningMaxSubtreeInvokes = new OptionKey<>(32);
120123

121124
@Option(help = "Minimum relative frequency for calls to get inlined. Default 0.001 on HotSpot and no minimum frequency on SVM.")//
122125
public static final OptionKey<Double> TruffleHostInliningMinFrequency = new OptionKey<>(DEFAULT_MIN_FREQUENCY);
@@ -144,7 +147,7 @@ public HostInliningPhase(CanonicalizerPhase canonicalizer, double defaultMinProf
144147
}
145148

146149
protected boolean isEnabledFor(TruffleHostEnvironment env, ResolvedJavaMethod method) {
147-
return isBytecodeInterpreterSwitch(env, method);
150+
return isBytecodeInterpreterSwitch(env, method) || isInliningRoot(env, method);
148151
}
149152

150153
protected String isTruffleBoundary(TruffleHostEnvironment env, ResolvedJavaMethod targetMethod) {
@@ -154,14 +157,18 @@ protected String isTruffleBoundary(TruffleHostEnvironment env, ResolvedJavaMetho
154157
return null;
155158
}
156159

157-
private boolean isBytecodeInterpreterSwitch(TruffleHostEnvironment env, ResolvedJavaMethod targetMethod) {
160+
protected final boolean isBytecodeInterpreterSwitch(TruffleHostEnvironment env, ResolvedJavaMethod targetMethod) {
158161
return env.getHostMethodInfo(translateMethod(targetMethod)).isBytecodeInterpreterSwitch();
159162
}
160163

161164
private boolean isInliningCutoff(TruffleHostEnvironment env, ResolvedJavaMethod targetMethod) {
162165
return env.getHostMethodInfo(translateMethod(targetMethod)).isInliningCutoff();
163166
}
164167

168+
private boolean isInliningRoot(TruffleHostEnvironment env, ResolvedJavaMethod targetMethod) {
169+
return env.getHostMethodInfo(translateMethod(targetMethod)).isInliningRoot();
170+
}
171+
165172
protected ResolvedJavaMethod translateMethod(ResolvedJavaMethod method) {
166173
return method;
167174
}
@@ -213,11 +220,10 @@ private void runImpl(InliningPhaseContext context) {
213220
* all together and fail if the graph becomes too big.
214221
*/
215222
sizeLimit = Options.TruffleHostInliningByteCodeInterpreterBudget.getValue(context.graph.getOptions());
216-
exploreLimit = Options.TruffleHostInliningBaseBudget.getValue(context.graph.getOptions());
217223
} else {
218224
sizeLimit = Options.TruffleHostInliningBaseBudget.getValue(context.graph.getOptions());
219-
exploreLimit = sizeLimit;
220225
}
226+
exploreLimit = Options.TruffleHostInliningExploreBudget.getValue(context.graph.getOptions());
221227

222228
if (sizeLimit < 0) {
223229
/*

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/truffle/host/TruffleKnownHostTypes.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ public final class TruffleKnownHostTypes extends AbstractKnownTruffleTypes {
5454
public final ResolvedJavaType BytecodeInterpreterSwitch = lookupType("com.oracle.truffle.api.HostCompilerDirectives$BytecodeInterpreterSwitch");
5555
public final ResolvedJavaType BytecodeInterpreterSwitchBoundary = lookupType("com.oracle.truffle.api.HostCompilerDirectives$BytecodeInterpreterSwitchBoundary");
5656
public final ResolvedJavaType InliningCutoff = lookupType("com.oracle.truffle.api.HostCompilerDirectives$InliningCutoff");
57+
public final ResolvedJavaType InliningRoot = lookupTypeOptional("com.oracle.truffle.api.HostCompilerDirectives$InliningRoot");
5758

5859
public final ResolvedJavaType HostCompilerDirectives = lookupTypeCached("com.oracle.truffle.api.HostCompilerDirectives");
5960
public final ResolvedJavaMethod HostCompilerDirectives_inInterpreterFastPath = findMethod(HostCompilerDirectives, "inInterpreterFastPath");

sdk/src/org.graalvm.collections/snapshot.sigtest

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,32 @@ meth public final void wait(long,int) throws java.lang.InterruptedException
3535
meth public int hashCode()
3636
meth public java.lang.String toString()
3737

38+
CLSS public abstract interface java.lang.annotation.Annotation
39+
meth public abstract boolean equals(java.lang.Object)
40+
meth public abstract int hashCode()
41+
meth public abstract java.lang.Class<? extends java.lang.annotation.Annotation> annotationType()
42+
meth public abstract java.lang.String toString()
43+
44+
CLSS public abstract interface !annotation java.lang.annotation.Documented
45+
anno 0 java.lang.annotation.Documented()
46+
anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
47+
anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[ANNOTATION_TYPE])
48+
intf java.lang.annotation.Annotation
49+
50+
CLSS public abstract interface !annotation java.lang.annotation.Retention
51+
anno 0 java.lang.annotation.Documented()
52+
anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
53+
anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[ANNOTATION_TYPE])
54+
intf java.lang.annotation.Annotation
55+
meth public abstract java.lang.annotation.RetentionPolicy value()
56+
57+
CLSS public abstract interface !annotation java.lang.annotation.Target
58+
anno 0 java.lang.annotation.Documented()
59+
anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
60+
anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[ANNOTATION_TYPE])
61+
intf java.lang.annotation.Annotation
62+
meth public abstract java.lang.annotation.ElementType[] value()
63+
3864
CLSS public java.util.concurrent.atomic.AtomicLong
3965
cons public init()
4066
cons public init(long)
@@ -75,7 +101,12 @@ meth public int intValue()
75101
meth public java.lang.String toString()
76102
meth public long longValue()
77103
supr java.lang.Number
78-
hfds U,VALUE,VM_SUPPORTS_LONG_CAS,serialVersionUID,value
104+
hfds U,VALUE,serialVersionUID,value
105+
106+
CLSS public abstract interface !annotation jdk.internal.vm.annotation.AOTSafeClassInitializer
107+
anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
108+
anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[TYPE])
109+
intf java.lang.annotation.Annotation
79110

80111
CLSS public abstract interface org.graalvm.collections.EconomicMap<%0 extends java.lang.Object, %1 extends java.lang.Object>
81112
intf org.graalvm.collections.UnmodifiableEconomicMap<{org.graalvm.collections.EconomicMap%0},{org.graalvm.collections.EconomicMap%1}>
@@ -136,7 +167,7 @@ meth public static <%0 extends java.lang.Object> org.graalvm.collections.Economi
136167
meth public static <%0 extends java.lang.Object> org.graalvm.collections.EconomicSet<{%%0}> create(org.graalvm.collections.Equivalence,int)
137168
meth public static <%0 extends java.lang.Object> org.graalvm.collections.EconomicSet<{%%0}> create(org.graalvm.collections.Equivalence,org.graalvm.collections.UnmodifiableEconomicSet<{%%0}>)
138169
meth public static <%0 extends java.lang.Object> org.graalvm.collections.EconomicSet<{%%0}> create(org.graalvm.collections.UnmodifiableEconomicSet<{%%0}>)
139-
meth public static org.graalvm.collections.EconomicSet emptySet()
170+
meth public static <%0 extends java.lang.Object> org.graalvm.collections.EconomicSet<{%%0}> emptySet()
140171
meth public void addAll(java.lang.Iterable<{org.graalvm.collections.EconomicSet%0}>)
141172
meth public void addAll(java.util.Iterator<{org.graalvm.collections.EconomicSet%0}>)
142173
meth public void addAll(org.graalvm.collections.EconomicSet<{org.graalvm.collections.EconomicSet%0}>)

sdk/src/org.graalvm.home/snapshot.sigtest

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,37 @@ meth public final void wait(long,int) throws java.lang.InterruptedException
1919
meth public int hashCode()
2020
meth public java.lang.String toString()
2121

22+
CLSS public abstract interface java.lang.annotation.Annotation
23+
meth public abstract boolean equals(java.lang.Object)
24+
meth public abstract int hashCode()
25+
meth public abstract java.lang.Class<? extends java.lang.annotation.Annotation> annotationType()
26+
meth public abstract java.lang.String toString()
27+
28+
CLSS public abstract interface !annotation java.lang.annotation.Documented
29+
anno 0 java.lang.annotation.Documented()
30+
anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
31+
anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[ANNOTATION_TYPE])
32+
intf java.lang.annotation.Annotation
33+
34+
CLSS public abstract interface !annotation java.lang.annotation.Retention
35+
anno 0 java.lang.annotation.Documented()
36+
anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
37+
anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[ANNOTATION_TYPE])
38+
intf java.lang.annotation.Annotation
39+
meth public abstract java.lang.annotation.RetentionPolicy value()
40+
41+
CLSS public abstract interface !annotation java.lang.annotation.Target
42+
anno 0 java.lang.annotation.Documented()
43+
anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
44+
anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[ANNOTATION_TYPE])
45+
intf java.lang.annotation.Annotation
46+
meth public abstract java.lang.annotation.ElementType[] value()
47+
48+
CLSS public abstract interface !annotation jdk.internal.vm.annotation.AOTSafeClassInitializer
49+
anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
50+
anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[TYPE])
51+
intf java.lang.annotation.Annotation
52+
2253
CLSS public abstract org.graalvm.home.HomeFinder
2354
cons public init()
2455
meth public abstract java.lang.String getVersion()
Lines changed: 53 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,5 @@
11
#Signature file v4.1
2-
#Version
3-
4-
CLSS public final org.graalvm.nativeimage.libgraal.LibGraalRuntime
5-
meth public static long getIsolateID()
6-
meth public static void notifyLowMemoryPoint(boolean)
7-
meth public static void processReferences()
8-
meth public static void fatalError(java.lang.String)
9-
supr java.lang.Object
10-
11-
CLSS public final org.graalvm.nativeimage.libgraal.hosted.GlobalData
12-
meth public static java.util.function.Supplier<java.lang.Long> createGlobal(long)
13-
supr java.lang.Object
14-
15-
CLSS public abstract interface org.graalvm.nativeimage.libgraal.hosted.LibGraalLoader
16-
meth public abstract java.util.Map getClassModuleMap()
2+
#Version
173

184
CLSS public java.lang.Object
195
cons public init()
@@ -29,3 +15,55 @@ meth public final void wait(long) throws java.lang.InterruptedException
2915
meth public final void wait(long,int) throws java.lang.InterruptedException
3016
meth public int hashCode()
3117
meth public java.lang.String toString()
18+
19+
CLSS public abstract interface java.lang.annotation.Annotation
20+
meth public abstract boolean equals(java.lang.Object)
21+
meth public abstract int hashCode()
22+
meth public abstract java.lang.Class<? extends java.lang.annotation.Annotation> annotationType()
23+
meth public abstract java.lang.String toString()
24+
25+
CLSS public abstract interface !annotation java.lang.annotation.Documented
26+
anno 0 java.lang.annotation.Documented()
27+
anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
28+
anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[ANNOTATION_TYPE])
29+
intf java.lang.annotation.Annotation
30+
31+
CLSS public abstract interface !annotation java.lang.annotation.Retention
32+
anno 0 java.lang.annotation.Documented()
33+
anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
34+
anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[ANNOTATION_TYPE])
35+
intf java.lang.annotation.Annotation
36+
meth public abstract java.lang.annotation.RetentionPolicy value()
37+
38+
CLSS public abstract interface !annotation java.lang.annotation.Target
39+
anno 0 java.lang.annotation.Documented()
40+
anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
41+
anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[ANNOTATION_TYPE])
42+
intf java.lang.annotation.Annotation
43+
meth public abstract java.lang.annotation.ElementType[] value()
44+
45+
CLSS public abstract interface !annotation jdk.internal.vm.annotation.AOTSafeClassInitializer
46+
anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
47+
anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[TYPE])
48+
intf java.lang.annotation.Annotation
49+
50+
CLSS public abstract interface !annotation org.graalvm.nativeimage.Platforms
51+
anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
52+
anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[TYPE, METHOD, CONSTRUCTOR, FIELD, PACKAGE])
53+
intf java.lang.annotation.Annotation
54+
meth public abstract java.lang.Class<? extends org.graalvm.nativeimage.Platform>[] value()
55+
56+
CLSS public final org.graalvm.nativeimage.libgraal.LibGraalRuntime
57+
meth public static long getIsolateID()
58+
meth public static void fatalError(java.lang.String)
59+
meth public static void notifyLowMemoryPoint(boolean)
60+
meth public static void processReferences()
61+
supr java.lang.Object
62+
63+
CLSS public final org.graalvm.nativeimage.libgraal.hosted.GlobalData
64+
meth public static java.util.function.Supplier<java.lang.Long> createGlobal(long)
65+
supr java.lang.Object
66+
67+
CLSS public abstract interface org.graalvm.nativeimage.libgraal.hosted.LibGraalLoader
68+
meth public abstract java.util.Map<java.lang.String,java.lang.String> getClassModuleMap()
69+

0 commit comments

Comments
 (0)