Skip to content

Commit 48345d4

Browse files
committed
[GR-41279] Provide reason for AnalysisType reachability.
PullRequest: graal/13188
2 parents 6a6be0b + 8f8f3f5 commit 48345d4

File tree

54 files changed

+321
-279
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+321
-279
lines changed

compiler/src/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/spi/ConstantFieldProvider.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,13 @@ public interface ConstantFieldTool<T> {
4242

4343
JavaConstant getReceiver();
4444

45+
/**
46+
* The reason why this constant folding was attempted. Ideally this is a
47+
* {@link jdk.vm.ci.code.BytecodePosition}, where available, or a {@link String}
48+
* description, however it can be {@code null}.
49+
*/
50+
Object getReason();
51+
4552
T foldConstant(JavaConstant ret);
4653

4754
T foldStableArray(JavaConstant ret, int stableDimensions, boolean isDefaultStable);

compiler/src/org.graalvm.compiler.hotspot.test/src/org/graalvm/compiler/hotspot/test/ClassSubstitutionsTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec
186186
ResolvedJavaField field = b.getMetaAccess().lookupJavaField(f);
187187
b.addPush(JavaKind.Object,
188188
LoadFieldNode.create(b.getConstantFieldProvider(), b.getConstantReflection(), b.getMetaAccess(), b.getOptions(),
189-
b.getAssumptions(), clazz, field, false, false));
189+
b.getAssumptions(), clazz, field, false, false, b.getGraph().currentNodeSourcePosition()));
190190
return true;
191191
}
192192
});

compiler/src/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/meta/HotSpotNodePlugin.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ private static boolean tryReadField(GraphBuilderContext b, ResolvedJavaField fie
119119
}
120120

121121
private static boolean tryConstantFold(GraphBuilderContext b, ResolvedJavaField field, JavaConstant object) {
122-
ConstantNode result = ConstantFoldUtil.tryConstantFold(b.getConstantFieldProvider(), b.getConstantReflection(), b.getMetaAccess(), field, object, b.getOptions());
122+
ConstantNode result = ConstantFoldUtil.tryConstantFold(b.getConstantFieldProvider(), b.getConstantReflection(), b.getMetaAccess(), field, object, b.getOptions(),
123+
b.getGraph().currentNodeSourcePosition());
123124
if (result != null) {
124125
result = b.getGraph().unique(result);
125126
b.push(field.getJavaKind(), result);

compiler/src/org.graalvm.compiler.java/src/org/graalvm/compiler/java/BytecodeParser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1560,10 +1560,10 @@ protected ValueNode genLoadField(ValueNode receiver, ResolvedJavaField field) {
15601560
StampPair stamp = graphBuilderConfig.getPlugins().getOverridingStamp(this, field.getType(), false);
15611561
if (stamp == null) {
15621562
return LoadFieldNode.create(getConstantFieldProvider(), getConstantReflection(), getMetaAccess(), getOptions(),
1563-
getAssumptions(), receiver, field, false, false);
1563+
getAssumptions(), receiver, field, false, false, createBytecodePosition());
15641564
} else {
15651565
return LoadFieldNode.createOverrideStamp(getConstantFieldProvider(), getConstantReflection(), getMetaAccess(), getOptions(),
1566-
stamp, receiver, field, false, false);
1566+
stamp, receiver, field, false, false, createBytecodePosition());
15671567
}
15681568
}
15691569

compiler/src/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/LoadFieldNode.java

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.graalvm.compiler.core.common.type.StampFactory;
3434
import org.graalvm.compiler.core.common.type.StampPair;
3535
import org.graalvm.compiler.graph.NodeClass;
36+
import org.graalvm.compiler.graph.NodeSourcePosition;
3637
import org.graalvm.compiler.nodeinfo.NodeCycles;
3738
import org.graalvm.compiler.nodeinfo.NodeInfo;
3839
import org.graalvm.compiler.nodes.ConstantNode;
@@ -94,9 +95,9 @@ public static LoadFieldNode create(Assumptions assumptions, ValueNode object, Re
9495
}
9596

9697
public static ValueNode create(ConstantFieldProvider constantFields, ConstantReflectionProvider constantReflection, MetaAccessProvider metaAccess,
97-
OptionValues options, Assumptions assumptions, ValueNode object, ResolvedJavaField field, boolean canonicalizeReads, boolean allUsagesAvailable) {
98+
OptionValues options, Assumptions assumptions, ValueNode object, ResolvedJavaField field, boolean canonicalizeReads, boolean allUsagesAvailable, NodeSourcePosition position) {
9899
return canonical(null, StampFactory.forDeclaredType(assumptions, field.getType(), false), object,
99-
field, constantFields, constantReflection, options, metaAccess, canonicalizeReads, allUsagesAvailable, false);
100+
field, constantFields, constantReflection, options, metaAccess, canonicalizeReads, allUsagesAvailable, false, position);
100101
}
101102

102103
public static LoadFieldNode createOverrideImmutable(LoadFieldNode node) {
@@ -108,8 +109,8 @@ public static LoadFieldNode createOverrideStamp(StampPair stamp, ValueNode objec
108109
}
109110

110111
public static ValueNode createOverrideStamp(ConstantFieldProvider constantFields, ConstantReflectionProvider constantReflection, MetaAccessProvider metaAccess,
111-
OptionValues options, StampPair stamp, ValueNode object, ResolvedJavaField field, boolean canonicalizeReads, boolean allUsagesAvailable) {
112-
return canonical(null, stamp, object, field, constantFields, constantReflection, options, metaAccess, canonicalizeReads, allUsagesAvailable, false);
112+
OptionValues options, StampPair stamp, ValueNode object, ResolvedJavaField field, boolean canonicalizeReads, boolean allUsagesAvailable, NodeSourcePosition position) {
113+
return canonical(null, stamp, object, field, constantFields, constantReflection, options, metaAccess, canonicalizeReads, allUsagesAvailable, false, position);
113114
}
114115

115116
@Override
@@ -137,21 +138,21 @@ public ValueNode canonical(CanonicalizerTool tool, ValueNode forObject) {
137138
}
138139
}
139140
return canonical(this, StampPair.create(stamp, uncheckedStamp), forObject, field, tool.getConstantFieldProvider(),
140-
tool.getConstantReflection(), tool.getOptions(), tool.getMetaAccess(), tool.canonicalizeReads(), tool.allUsagesAvailable(), false);
141+
tool.getConstantReflection(), tool.getOptions(), tool.getMetaAccess(), tool.canonicalizeReads(), tool.allUsagesAvailable(), false, getNodeSourcePosition());
141142
}
142143

143144
private static ValueNode canonical(LoadFieldNode loadFieldNode, StampPair stamp, ValueNode forObject, ResolvedJavaField field,
144145
ConstantFieldProvider constantFields, ConstantReflectionProvider constantReflection,
145-
OptionValues options, MetaAccessProvider metaAccess, boolean canonicalizeReads, boolean allUsagesAvailable, boolean immutable) {
146+
OptionValues options, MetaAccessProvider metaAccess, boolean canonicalizeReads, boolean allUsagesAvailable, boolean immutable, NodeSourcePosition position) {
146147
LoadFieldNode self = loadFieldNode;
147148
if (canonicalizeReads && metaAccess != null) {
148-
ConstantNode constant = asConstant(constantFields, constantReflection, metaAccess, options, forObject, field);
149+
ConstantNode constant = asConstant(constantFields, constantReflection, metaAccess, options, forObject, field, position);
149150
if (constant != null) {
150151
return constant;
151152
}
152153
if (allUsagesAvailable) {
153154
PhiNode phi = asPhi(constantFields, constantReflection, metaAccess, options, forObject,
154-
field, stamp.getTrustedStamp());
155+
field, stamp.getTrustedStamp(), position);
155156
if (phi != null) {
156157
return phi;
157158
}
@@ -171,32 +172,32 @@ private static ValueNode canonical(LoadFieldNode loadFieldNode, StampPair stamp,
171172
*/
172173
public ConstantNode asConstant(CanonicalizerTool tool, ValueNode forObject) {
173174
return asConstant(tool.getConstantFieldProvider(), tool.getConstantReflection(),
174-
tool.getMetaAccess(), tool.getOptions(), forObject, field);
175+
tool.getMetaAccess(), tool.getOptions(), forObject, field, getNodeSourcePosition());
175176
}
176177

177178
private static ConstantNode asConstant(ConstantFieldProvider constantFields, ConstantReflectionProvider constantReflection,
178-
MetaAccessProvider metaAccess, OptionValues options, ValueNode forObject, ResolvedJavaField field) {
179+
MetaAccessProvider metaAccess, OptionValues options, ValueNode forObject, ResolvedJavaField field, NodeSourcePosition position) {
179180
if (field.isStatic()) {
180-
return ConstantFoldUtil.tryConstantFold(constantFields, constantReflection, metaAccess, field, null, options);
181+
return ConstantFoldUtil.tryConstantFold(constantFields, constantReflection, metaAccess, field, null, options, position);
181182
} else if (forObject.isConstant() && !forObject.isNullConstant()) {
182-
return ConstantFoldUtil.tryConstantFold(constantFields, constantReflection, metaAccess, field, forObject.asJavaConstant(), options);
183+
return ConstantFoldUtil.tryConstantFold(constantFields, constantReflection, metaAccess, field, forObject.asJavaConstant(), options, position);
183184
}
184185
return null;
185186
}
186187

187188
public ConstantNode asConstant(CanonicalizerTool tool, JavaConstant constant) {
188-
return ConstantFoldUtil.tryConstantFold(tool.getConstantFieldProvider(), tool.getConstantReflection(), tool.getMetaAccess(), field(), constant, tool.getOptions());
189+
return ConstantFoldUtil.tryConstantFold(tool.getConstantFieldProvider(), tool.getConstantReflection(), tool.getMetaAccess(), field(), constant, tool.getOptions(), getNodeSourcePosition());
189190
}
190191

191192
private static PhiNode asPhi(ConstantFieldProvider constantFields, ConstantReflectionProvider constantReflection,
192-
MetaAccessProvider metaAcccess, OptionValues options, ValueNode forObject, ResolvedJavaField field, Stamp stamp) {
193+
MetaAccessProvider metaAcccess, OptionValues options, ValueNode forObject, ResolvedJavaField field, Stamp stamp, NodeSourcePosition position) {
193194
if (!field.isStatic() && (field.isFinal() || constantFields.maybeFinal(field)) && forObject instanceof ValuePhiNode &&
194195
((ValuePhiNode) forObject).values().filter(isNotA(ConstantNode.class)).isEmpty()) {
195196
PhiNode phi = (PhiNode) forObject;
196197
ConstantNode[] constantNodes = new ConstantNode[phi.valueCount()];
197198
for (int i = 0; i < phi.valueCount(); i++) {
198199
ConstantNode constant = ConstantFoldUtil.tryConstantFold(constantFields, constantReflection, metaAcccess, field, phi.valueAt(i).asJavaConstant(),
199-
options);
200+
options, position);
200201
if (constant == null) {
201202
return null;
202203
}

compiler/src/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/memory/ReadNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ private static ValueNode canonicalizeRead(ValueNode read, Stamp accessStamp, Val
216216
// normally not considered immutable.
217217
ResolvedJavaField field = ((FieldLocationIdentity) locationIdentity).getField();
218218
ConstantNode constantNode = ConstantFoldUtil.tryConstantFold(tool, field, object.asJavaConstant(), displacement, resultStamp,
219-
accessStamp, read.getOptions());
219+
accessStamp, read.getOptions(), read.getNodeSourcePosition());
220220
if (constantNode != null) {
221221
return constantNode;
222222
}

compiler/src/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/util/ConstantFoldUtil.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
public class ConstantFoldUtil {
4242

4343
public static ConstantNode tryConstantFold(ConstantFieldProvider fieldProvider, ConstantReflectionProvider constantReflection, MetaAccessProvider metaAccess, ResolvedJavaField field,
44-
JavaConstant receiver, OptionValues options) {
44+
JavaConstant receiver, OptionValues options, Object reason) {
4545
if (!field.isStatic()) {
4646
if (receiver == null || receiver.isNull()) {
4747
return null;
@@ -60,6 +60,11 @@ public JavaConstant getReceiver() {
6060
return receiver;
6161
}
6262

63+
@Override
64+
public Object getReason() {
65+
return reason;
66+
}
67+
6368
@Override
6469
public ConstantNode foldConstant(JavaConstant ret) {
6570
if (ret != null) {
@@ -89,7 +94,8 @@ public OptionValues getOptions() {
8994
* Perform a constant folding read on a regular Java field that's already been lowered to a
9095
* {@link ReadNode}.
9196
*/
92-
public static ConstantNode tryConstantFold(CoreProviders tool, ResolvedJavaField field, JavaConstant receiver, long displacement, Stamp resultStamp, Stamp accessStamp, OptionValues options) {
97+
public static ConstantNode tryConstantFold(CoreProviders tool, ResolvedJavaField field, JavaConstant receiver, long displacement, Stamp resultStamp, Stamp accessStamp, OptionValues options,
98+
Object reason) {
9399
if (!field.isStatic()) {
94100
if (receiver == null || receiver.isNull()) {
95101
return null;
@@ -112,6 +118,11 @@ public JavaConstant getReceiver() {
112118
return receiver;
113119
}
114120

121+
@Override
122+
public Object getReason() {
123+
return reason;
124+
}
125+
115126
@Override
116127
public ConstantNode foldConstant(JavaConstant ret) {
117128
if (ret != null) {

compiler/src/org.graalvm.compiler.replacements/src/org/graalvm/compiler/replacements/InvocationPluginHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ public LogicNode createCompare(ValueNode x, CanonicalCondition cond, ValueNode y
272272

273273
public ValueNode loadField(ValueNode value, ResolvedJavaField field) {
274274
return b.add(LoadFieldNode.create(b.getConstantFieldProvider(), b.getConstantReflection(), b.getMetaAccess(),
275-
b.getOptions(), b.getAssumptions(), value, field, false, false));
275+
b.getOptions(), b.getAssumptions(), value, field, false, false, b.getGraph().currentNodeSourcePosition()));
276276
}
277277

278278
/**

substratevm/src/com.oracle.graal.pointsto.standalone/src/com/oracle/graal/pointsto/standalone/PointsToAnalyzer.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,6 @@ private PointsToAnalyzer(String mainEntryClass, OptionValues options) {
137137
AnalysisUniverse aUniverse = new AnalysisUniverse(standaloneHost, wordKind,
138138
analysisPolicy, SubstitutionProcessor.IDENTITY, originalMetaAccess, snippetReflection, snippetReflection, new PointsToAnalysisFactory());
139139
AnalysisMetaAccess aMetaAccess = new AnalysisMetaAccess(aUniverse, originalMetaAccess);
140-
aMetaAccess.lookupJavaType(String.class).registerAsReachable();
141140
StandaloneConstantReflectionProvider aConstantReflection = new StandaloneConstantReflectionProvider(aUniverse, HotSpotJVMCIRuntime.runtime());
142141
StandaloneConstantFieldProvider aConstantFieldProvider = new StandaloneConstantFieldProvider(aMetaAccess);
143142
AnalysisMetaAccessExtensionProvider aMetaAccessExtensionProvider = new AnalysisMetaAccessExtensionProvider();
@@ -171,14 +170,14 @@ private PointsToAnalyzer(String mainEntryClass, OptionValues options) {
171170
* good example.
172171
*/
173172
try (Indent ignored = debugContext.logAndIndent("add initial classes/fields/methods")) {
174-
bigbang.addRootClass(Object.class, false, false).registerAsInHeap("Root class.");
175-
bigbang.addRootClass(String.class, false, false).registerAsInHeap("Root class.");
176-
bigbang.addRootClass(String[].class, false, false).registerAsInHeap("Root class.");
177-
bigbang.addRootField(String.class, "value").registerAsInHeap("Root class.");
178-
bigbang.addRootClass(long[].class, false, false).registerAsInHeap("Root class.");
179-
bigbang.addRootClass(byte[].class, false, false).registerAsInHeap("Root class.");
180-
bigbang.addRootClass(byte[][].class, false, false).registerAsInHeap("Root class.");
181-
bigbang.addRootClass(Object[].class, false, false).registerAsInHeap("Root class.");
173+
bigbang.addRootClass(Object.class, false, false).registerAsInHeap("root class");
174+
bigbang.addRootClass(String.class, false, false).registerAsInHeap("root class");
175+
bigbang.addRootClass(String[].class, false, false).registerAsInHeap("root class");
176+
bigbang.addRootField(String.class, "value").registerAsInHeap("root class");
177+
bigbang.addRootClass(long[].class, false, false).registerAsInHeap("root class");
178+
bigbang.addRootClass(byte[].class, false, false).registerAsInHeap("root class");
179+
bigbang.addRootClass(byte[][].class, false, false).registerAsInHeap("root class");
180+
bigbang.addRootClass(Object[].class, false, false).registerAsInHeap("root class");
182181

183182
bigbang.addRootMethod(ReflectionUtil.lookupMethod(Object.class, "getClass"), true);
184183

@@ -187,7 +186,7 @@ private PointsToAnalyzer(String mainEntryClass, OptionValues options) {
187186
bigbang.addRootClass(kind.toJavaClass(), false, true);
188187
}
189188
}
190-
bigbang.getMetaAccess().lookupJavaType(JavaKind.Void.toJavaClass()).registerAsReachable();
189+
bigbang.getMetaAccess().lookupJavaType(JavaKind.Void.toJavaClass()).registerAsReachable("root class");
191190

192191
GraphBuilderConfiguration.Plugins plugins = new GraphBuilderConfiguration.Plugins(new InvocationPlugins());
193192
NoClassInitializationPlugin classInitializationPlugin = new NoClassInitializationPlugin();

substratevm/src/com.oracle.graal.pointsto.standalone/src/com/oracle/graal/pointsto/standalone/StandalonePointsToAnalysis.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@
2626

2727
package com.oracle.graal.pointsto.standalone;
2828

29+
import java.util.Set;
30+
import java.util.concurrent.ConcurrentHashMap;
31+
import java.util.concurrent.ForkJoinPool;
32+
33+
import org.graalvm.compiler.options.OptionValues;
34+
2935
import com.oracle.graal.pointsto.PointsToAnalysis;
3036
import com.oracle.graal.pointsto.api.HostVM;
3137
import com.oracle.graal.pointsto.constraints.UnsupportedFeatures;
@@ -34,11 +40,6 @@
3440
import com.oracle.graal.pointsto.meta.AnalysisUniverse;
3541
import com.oracle.graal.pointsto.meta.HostedProviders;
3642
import com.oracle.graal.pointsto.util.TimerCollection;
37-
import org.graalvm.compiler.options.OptionValues;
38-
39-
import java.util.Set;
40-
import java.util.concurrent.ConcurrentHashMap;
41-
import java.util.concurrent.ForkJoinPool;
4243

4344
public class StandalonePointsToAnalysis extends PointsToAnalysis {
4445
private Set<AnalysisMethod> addedClinits = ConcurrentHashMap.newKeySet();

0 commit comments

Comments
 (0)