Skip to content

Commit 9764aa6

Browse files
committed
Implement a graph optimization independent constant expression analysis for resolving dynamic access invocations.
1 parent b470827 commit 9764aa6

File tree

19 files changed

+3479
-107
lines changed

19 files changed

+3479
-107
lines changed

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/nodes/graphbuilderconf/GraphBuilderContext.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
import jdk.graal.compiler.nodes.type.StampTool;
7676
import jdk.internal.misc.ScopedMemoryAccess;
7777
import jdk.vm.ci.code.BailoutException;
78+
import jdk.vm.ci.code.BytecodePosition;
7879
import jdk.vm.ci.meta.Assumptions;
7980
import jdk.vm.ci.meta.DeoptimizationAction;
8081
import jdk.vm.ci.meta.DeoptimizationReason;
@@ -281,6 +282,19 @@ default int getDepth() {
281282
return result;
282283
}
283284

285+
/**
286+
* Gets the inlining chain of this context. A null return value implies that this is the context
287+
* for the parse root.
288+
*/
289+
default BytecodePosition getInliningChain() {
290+
BytecodePosition inliningContext = null;
291+
for (GraphBuilderContext cur = getParent(); cur != null; cur = cur.getParent()) {
292+
BytecodePosition caller = new BytecodePosition(null, cur.getMethod(), cur.bci());
293+
inliningContext = inliningContext == null ? caller : inliningContext.addCaller(caller);
294+
}
295+
return inliningContext;
296+
}
297+
284298
/**
285299
* Computes the recursive inlining depth of the provided method, i.e., counts how often the
286300
* provided method is already in the {@link #getParent()} chain starting at this context.

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/IntrinsicGraphBuilder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
import jdk.graal.compiler.nodes.spi.CoreProvidersDelegate;
6969
import jdk.graal.compiler.options.OptionValues;
7070
import jdk.vm.ci.code.BailoutException;
71+
import jdk.vm.ci.code.BytecodePosition;
7172
import jdk.vm.ci.meta.DeoptimizationAction;
7273
import jdk.vm.ci.meta.DeoptimizationReason;
7374
import jdk.vm.ci.meta.JavaKind;
@@ -325,6 +326,11 @@ public int getDepth() {
325326
return 0;
326327
}
327328

329+
@Override
330+
public BytecodePosition getInliningChain() {
331+
return null;
332+
}
333+
328334
@Override
329335
public boolean parsingIntrinsic() {
330336
return false;

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/replacements/PEGraphDecoder.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@
141141
import jdk.vm.ci.code.Architecture;
142142
import jdk.vm.ci.code.BailoutException;
143143
import jdk.vm.ci.code.BytecodeFrame;
144+
import jdk.vm.ci.code.BytecodePosition;
144145
import jdk.vm.ci.meta.DeoptimizationAction;
145146
import jdk.vm.ci.meta.DeoptimizationReason;
146147
import jdk.vm.ci.meta.JavaConstant;
@@ -412,6 +413,18 @@ public int getDepth() {
412413
return methodScope.inliningDepth;
413414
}
414415

416+
@Override
417+
public BytecodePosition getInliningChain() {
418+
BytecodePosition inliningContext = null;
419+
int bci = methodScope.invokeData == null ? 0 : methodScope.invokeData.invoke.bci();
420+
for (PEMethodScope cur = methodScope.caller; cur != null; cur = cur.caller) {
421+
BytecodePosition caller = new BytecodePosition(null, cur.method, bci);
422+
inliningContext = inliningContext == null ? caller : inliningContext.addCaller(caller);
423+
bci = cur.invokeData == null ? 0 : cur.invokeData.invoke.bci();
424+
}
425+
return inliningContext;
426+
}
427+
415428
@Override
416429
public int recursiveInliningDepth(ResolvedJavaMethod method) {
417430
int result = 0;

substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/infrastructure/WrappedConstantPool.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,4 +233,8 @@ public JavaConstant lookup() {
233233
return lookupConstant(wrapped.lookup());
234234
}
235235
}
236+
237+
public ConstantPool getWrapped() {
238+
return wrapped;
239+
}
236240
}

substratevm/src/com.oracle.svm.graal/src/com/oracle/svm/graal/hosted/runtimecompilation/RuntimeCompiledMethodSupport.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,11 @@ protected boolean tryInvocationPlugin(CallTargetNode.InvokeKind invokeKind, Valu
477477
protected boolean shouldVerifyFrameStates() {
478478
return Options.VerifyRuntimeCompilationFrameStates.getValue();
479479
}
480+
481+
@Override
482+
protected boolean strictDynamicAccessInferenceIsApplicable() {
483+
return false;
484+
}
480485
}
481486

482487
/**

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ResourcesFeature.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@
9090
import com.oracle.svm.core.util.VMError;
9191
import com.oracle.svm.hosted.classinitialization.ClassInitializationSupport;
9292
import com.oracle.svm.hosted.config.ConfigurationParserUtils;
93+
import com.oracle.svm.hosted.dynamicaccessinference.DynamicAccessInferenceLog;
94+
import com.oracle.svm.hosted.dynamicaccessinference.StrictDynamicAccessInferenceFeature;
9395
import com.oracle.svm.hosted.imagelayer.HostedImageLayerBuildingSupport;
9496
import com.oracle.svm.hosted.jdk.localization.LocalizationFeature;
9597
import com.oracle.svm.hosted.reflect.NativeImageConditionResolver;
@@ -174,6 +176,8 @@ private record CompiledConditionalPattern(ConfigurationCondition condition, Reso
174176
private int loadedConfigurations;
175177
private ImageClassLoader imageClassLoader;
176178

179+
private DynamicAccessInferenceLog inferenceLog;
180+
177181
private class ResourcesRegistryImpl extends ConditionalConfigurationRegistry implements ResourcesRegistry<ConfigurationCondition> {
178182
private final ClassInitializationSupport classInitializationSupport = ClassInitializationSupport.singleton();
179183

@@ -484,6 +488,8 @@ public void beforeAnalysis(BeforeAnalysisAccess a) {
484488
globWorkSet = Set.of();
485489

486490
resourceRegistryImpl().setAnalysisAccess(access);
491+
492+
inferenceLog = DynamicAccessInferenceLog.singletonOrNull();
487493
}
488494

489495
private static final class ResourceCollectorImpl extends ConditionalConfigurationRegistry implements ResourceCollector {
@@ -672,7 +678,7 @@ public void beforeCompilation(BeforeCompilationAccess access) {
672678

673679
@Override
674680
public void registerInvocationPlugins(Providers providers, GraphBuilderConfiguration.Plugins plugins, ParsingReason reason) {
675-
if (!reason.duringAnalysis() || reason == ParsingReason.JITCompilation) {
681+
if (!reason.duringAnalysis() || reason == ParsingReason.JITCompilation || StrictDynamicAccessInferenceFeature.isEnforced()) {
676682
return;
677683
}
678684

@@ -712,6 +718,9 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec
712718
throw VMError.shouldNotReachHere(e);
713719
}
714720
b.add(ReachabilityRegistrationNode.create(() -> RuntimeResourceAccess.addResource(clazz.getModule(), resourceName), reason));
721+
if (inferenceLog != null) {
722+
inferenceLog.logRegistration(b, reason, targetMethod, clazz, new String[]{resource});
723+
}
715724
return true;
716725
}
717726
return false;

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SVMHost.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@
119119
import com.oracle.svm.hosted.code.InliningUtilities;
120120
import com.oracle.svm.hosted.code.SubstrateCompilationDirectives;
121121
import com.oracle.svm.hosted.code.UninterruptibleAnnotationChecker;
122+
import com.oracle.svm.hosted.dynamicaccessinference.ConstantExpressionRegistry;
123+
import com.oracle.svm.hosted.dynamicaccessinference.StrictDynamicAccessInferenceFeature;
122124
import com.oracle.svm.hosted.fieldfolding.StaticFinalFieldFoldingPhase;
123125
import com.oracle.svm.hosted.heap.PodSupport;
124126
import com.oracle.svm.hosted.imagelayer.HostedDynamicLayerInfo;
@@ -226,6 +228,8 @@ public enum UsageKind {
226228
private final LayeredStaticFieldSupport layeredStaticFieldSupport;
227229
private final MetaAccessProvider originalMetaAccess;
228230

231+
private final ConstantExpressionRegistry constantExpressionRegistry;
232+
229233
@SuppressWarnings("this-escape")
230234
public SVMHost(OptionValues options, ImageClassLoader loader, ClassInitializationSupport classInitializationSupport, AnnotationSubstitutionProcessor annotationSubstitutions,
231235
MissingRegistrationSupport missingRegistrationSupport) {
@@ -269,6 +273,8 @@ public SVMHost(OptionValues options, ImageClassLoader loader, ClassInitializatio
269273
featureType = lookupOriginalType(Feature.class);
270274

271275
verifyNamingConventions = SubstrateOptions.VerifyNamingConventions.getValue();
276+
277+
constantExpressionRegistry = StrictDynamicAccessInferenceFeature.isActive() ? ConstantExpressionRegistry.singleton() : null;
272278
}
273279

274280
/**
@@ -1373,4 +1379,8 @@ public boolean allowConstantFolding(AnalysisMethod method) {
13731379
public SimulateClassInitializerSupport createSimulateClassInitializerSupport(AnalysisMetaAccess aMetaAccess) {
13741380
return new SimulateClassInitializerSupport(aMetaAccess, this);
13751381
}
1382+
1383+
public ConstantExpressionRegistry getConstantExpressionRegistry() {
1384+
return constantExpressionRegistry;
1385+
}
13761386
}

0 commit comments

Comments
 (0)