Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,13 @@ public interface ConstantFieldTool<T> {

JavaConstant getReceiver();

/**
* The reason why this constant folding was attempted. Ideally this is a
* {@link jdk.vm.ci.code.BytecodePosition}, where available, or a {@link String}
* description, however it can be {@code null}.
*/
Object getReason();

T foldConstant(JavaConstant ret);

T foldStableArray(JavaConstant ret, int stableDimensions, boolean isDefaultStable);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Rec
ResolvedJavaField field = b.getMetaAccess().lookupJavaField(f);
b.addPush(JavaKind.Object,
LoadFieldNode.create(b.getConstantFieldProvider(), b.getConstantReflection(), b.getMetaAccess(), b.getOptions(),
b.getAssumptions(), clazz, field, false, false));
b.getAssumptions(), clazz, field, false, false, b.getGraph().currentNodeSourcePosition()));
return true;
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,8 @@ private static boolean tryReadField(GraphBuilderContext b, ResolvedJavaField fie
}

private static boolean tryConstantFold(GraphBuilderContext b, ResolvedJavaField field, JavaConstant object) {
ConstantNode result = ConstantFoldUtil.tryConstantFold(b.getConstantFieldProvider(), b.getConstantReflection(), b.getMetaAccess(), field, object, b.getOptions());
ConstantNode result = ConstantFoldUtil.tryConstantFold(b.getConstantFieldProvider(), b.getConstantReflection(), b.getMetaAccess(), field, object, b.getOptions(),
b.getGraph().currentNodeSourcePosition());
if (result != null) {
result = b.getGraph().unique(result);
b.push(field.getJavaKind(), result);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1560,10 +1560,10 @@ protected ValueNode genLoadField(ValueNode receiver, ResolvedJavaField field) {
StampPair stamp = graphBuilderConfig.getPlugins().getOverridingStamp(this, field.getType(), false);
if (stamp == null) {
return LoadFieldNode.create(getConstantFieldProvider(), getConstantReflection(), getMetaAccess(), getOptions(),
getAssumptions(), receiver, field, false, false);
getAssumptions(), receiver, field, false, false, createBytecodePosition());
} else {
return LoadFieldNode.createOverrideStamp(getConstantFieldProvider(), getConstantReflection(), getMetaAccess(), getOptions(),
stamp, receiver, field, false, false);
stamp, receiver, field, false, false, createBytecodePosition());
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import org.graalvm.compiler.core.common.type.StampFactory;
import org.graalvm.compiler.core.common.type.StampPair;
import org.graalvm.compiler.graph.NodeClass;
import org.graalvm.compiler.graph.NodeSourcePosition;
import org.graalvm.compiler.nodeinfo.NodeCycles;
import org.graalvm.compiler.nodeinfo.NodeInfo;
import org.graalvm.compiler.nodes.ConstantNode;
Expand Down Expand Up @@ -94,9 +95,9 @@ public static LoadFieldNode create(Assumptions assumptions, ValueNode object, Re
}

public static ValueNode create(ConstantFieldProvider constantFields, ConstantReflectionProvider constantReflection, MetaAccessProvider metaAccess,
OptionValues options, Assumptions assumptions, ValueNode object, ResolvedJavaField field, boolean canonicalizeReads, boolean allUsagesAvailable) {
OptionValues options, Assumptions assumptions, ValueNode object, ResolvedJavaField field, boolean canonicalizeReads, boolean allUsagesAvailable, NodeSourcePosition position) {
return canonical(null, StampFactory.forDeclaredType(assumptions, field.getType(), false), object,
field, constantFields, constantReflection, options, metaAccess, canonicalizeReads, allUsagesAvailable, false);
field, constantFields, constantReflection, options, metaAccess, canonicalizeReads, allUsagesAvailable, false, position);
}

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

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

@Override
Expand Down Expand Up @@ -137,21 +138,21 @@ public ValueNode canonical(CanonicalizerTool tool, ValueNode forObject) {
}
}
return canonical(this, StampPair.create(stamp, uncheckedStamp), forObject, field, tool.getConstantFieldProvider(),
tool.getConstantReflection(), tool.getOptions(), tool.getMetaAccess(), tool.canonicalizeReads(), tool.allUsagesAvailable(), false);
tool.getConstantReflection(), tool.getOptions(), tool.getMetaAccess(), tool.canonicalizeReads(), tool.allUsagesAvailable(), false, getNodeSourcePosition());
}

private static ValueNode canonical(LoadFieldNode loadFieldNode, StampPair stamp, ValueNode forObject, ResolvedJavaField field,
ConstantFieldProvider constantFields, ConstantReflectionProvider constantReflection,
OptionValues options, MetaAccessProvider metaAccess, boolean canonicalizeReads, boolean allUsagesAvailable, boolean immutable) {
OptionValues options, MetaAccessProvider metaAccess, boolean canonicalizeReads, boolean allUsagesAvailable, boolean immutable, NodeSourcePosition position) {
LoadFieldNode self = loadFieldNode;
if (canonicalizeReads && metaAccess != null) {
ConstantNode constant = asConstant(constantFields, constantReflection, metaAccess, options, forObject, field);
ConstantNode constant = asConstant(constantFields, constantReflection, metaAccess, options, forObject, field, position);
if (constant != null) {
return constant;
}
if (allUsagesAvailable) {
PhiNode phi = asPhi(constantFields, constantReflection, metaAccess, options, forObject,
field, stamp.getTrustedStamp());
field, stamp.getTrustedStamp(), position);
if (phi != null) {
return phi;
}
Expand All @@ -171,32 +172,32 @@ private static ValueNode canonical(LoadFieldNode loadFieldNode, StampPair stamp,
*/
public ConstantNode asConstant(CanonicalizerTool tool, ValueNode forObject) {
return asConstant(tool.getConstantFieldProvider(), tool.getConstantReflection(),
tool.getMetaAccess(), tool.getOptions(), forObject, field);
tool.getMetaAccess(), tool.getOptions(), forObject, field, getNodeSourcePosition());
}

private static ConstantNode asConstant(ConstantFieldProvider constantFields, ConstantReflectionProvider constantReflection,
MetaAccessProvider metaAccess, OptionValues options, ValueNode forObject, ResolvedJavaField field) {
MetaAccessProvider metaAccess, OptionValues options, ValueNode forObject, ResolvedJavaField field, NodeSourcePosition position) {
if (field.isStatic()) {
return ConstantFoldUtil.tryConstantFold(constantFields, constantReflection, metaAccess, field, null, options);
return ConstantFoldUtil.tryConstantFold(constantFields, constantReflection, metaAccess, field, null, options, position);
} else if (forObject.isConstant() && !forObject.isNullConstant()) {
return ConstantFoldUtil.tryConstantFold(constantFields, constantReflection, metaAccess, field, forObject.asJavaConstant(), options);
return ConstantFoldUtil.tryConstantFold(constantFields, constantReflection, metaAccess, field, forObject.asJavaConstant(), options, position);
}
return null;
}

public ConstantNode asConstant(CanonicalizerTool tool, JavaConstant constant) {
return ConstantFoldUtil.tryConstantFold(tool.getConstantFieldProvider(), tool.getConstantReflection(), tool.getMetaAccess(), field(), constant, tool.getOptions());
return ConstantFoldUtil.tryConstantFold(tool.getConstantFieldProvider(), tool.getConstantReflection(), tool.getMetaAccess(), field(), constant, tool.getOptions(), getNodeSourcePosition());
}

private static PhiNode asPhi(ConstantFieldProvider constantFields, ConstantReflectionProvider constantReflection,
MetaAccessProvider metaAcccess, OptionValues options, ValueNode forObject, ResolvedJavaField field, Stamp stamp) {
MetaAccessProvider metaAcccess, OptionValues options, ValueNode forObject, ResolvedJavaField field, Stamp stamp, NodeSourcePosition position) {
if (!field.isStatic() && (field.isFinal() || constantFields.maybeFinal(field)) && forObject instanceof ValuePhiNode &&
((ValuePhiNode) forObject).values().filter(isNotA(ConstantNode.class)).isEmpty()) {
PhiNode phi = (PhiNode) forObject;
ConstantNode[] constantNodes = new ConstantNode[phi.valueCount()];
for (int i = 0; i < phi.valueCount(); i++) {
ConstantNode constant = ConstantFoldUtil.tryConstantFold(constantFields, constantReflection, metaAcccess, field, phi.valueAt(i).asJavaConstant(),
options);
options, position);
if (constant == null) {
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ private static ValueNode canonicalizeRead(ValueNode read, Stamp accessStamp, Val
// normally not considered immutable.
ResolvedJavaField field = ((FieldLocationIdentity) locationIdentity).getField();
ConstantNode constantNode = ConstantFoldUtil.tryConstantFold(tool, field, object.asJavaConstant(), displacement, resultStamp,
accessStamp, read.getOptions());
accessStamp, read.getOptions(), read.getNodeSourcePosition());
if (constantNode != null) {
return constantNode;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
public class ConstantFoldUtil {

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

@Override
public Object getReason() {
return reason;
}

@Override
public ConstantNode foldConstant(JavaConstant ret) {
if (ret != null) {
Expand Down Expand Up @@ -89,7 +94,8 @@ public OptionValues getOptions() {
* Perform a constant folding read on a regular Java field that's already been lowered to a
* {@link ReadNode}.
*/
public static ConstantNode tryConstantFold(CoreProviders tool, ResolvedJavaField field, JavaConstant receiver, long displacement, Stamp resultStamp, Stamp accessStamp, OptionValues options) {
public static ConstantNode tryConstantFold(CoreProviders tool, ResolvedJavaField field, JavaConstant receiver, long displacement, Stamp resultStamp, Stamp accessStamp, OptionValues options,
Object reason) {
if (!field.isStatic()) {
if (receiver == null || receiver.isNull()) {
return null;
Expand All @@ -112,6 +118,11 @@ public JavaConstant getReceiver() {
return receiver;
}

@Override
public Object getReason() {
return reason;
}

@Override
public ConstantNode foldConstant(JavaConstant ret) {
if (ret != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ public LogicNode createCompare(ValueNode x, CanonicalCondition cond, ValueNode y

public ValueNode loadField(ValueNode value, ResolvedJavaField field) {
return b.add(LoadFieldNode.create(b.getConstantFieldProvider(), b.getConstantReflection(), b.getMetaAccess(),
b.getOptions(), b.getAssumptions(), value, field, false, false));
b.getOptions(), b.getAssumptions(), value, field, false, false, b.getGraph().currentNodeSourcePosition()));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,6 @@ private PointsToAnalyzer(String mainEntryClass, OptionValues options) {
AnalysisUniverse aUniverse = new AnalysisUniverse(standaloneHost, wordKind,
analysisPolicy, SubstitutionProcessor.IDENTITY, originalMetaAccess, snippetReflection, snippetReflection, new PointsToAnalysisFactory());
AnalysisMetaAccess aMetaAccess = new AnalysisMetaAccess(aUniverse, originalMetaAccess);
aMetaAccess.lookupJavaType(String.class).registerAsReachable();
StandaloneConstantReflectionProvider aConstantReflection = new StandaloneConstantReflectionProvider(aUniverse, HotSpotJVMCIRuntime.runtime());
StandaloneConstantFieldProvider aConstantFieldProvider = new StandaloneConstantFieldProvider(aMetaAccess);
AnalysisMetaAccessExtensionProvider aMetaAccessExtensionProvider = new AnalysisMetaAccessExtensionProvider();
Expand Down Expand Up @@ -171,14 +170,14 @@ private PointsToAnalyzer(String mainEntryClass, OptionValues options) {
* good example.
*/
try (Indent ignored = debugContext.logAndIndent("add initial classes/fields/methods")) {
bigbang.addRootClass(Object.class, false, false).registerAsInHeap("Root class.");
bigbang.addRootClass(String.class, false, false).registerAsInHeap("Root class.");
bigbang.addRootClass(String[].class, false, false).registerAsInHeap("Root class.");
bigbang.addRootField(String.class, "value").registerAsInHeap("Root class.");
bigbang.addRootClass(long[].class, false, false).registerAsInHeap("Root class.");
bigbang.addRootClass(byte[].class, false, false).registerAsInHeap("Root class.");
bigbang.addRootClass(byte[][].class, false, false).registerAsInHeap("Root class.");
bigbang.addRootClass(Object[].class, false, false).registerAsInHeap("Root class.");
bigbang.addRootClass(Object.class, false, false).registerAsInHeap("root class");
bigbang.addRootClass(String.class, false, false).registerAsInHeap("root class");
bigbang.addRootClass(String[].class, false, false).registerAsInHeap("root class");
bigbang.addRootField(String.class, "value").registerAsInHeap("root class");
bigbang.addRootClass(long[].class, false, false).registerAsInHeap("root class");
bigbang.addRootClass(byte[].class, false, false).registerAsInHeap("root class");
bigbang.addRootClass(byte[][].class, false, false).registerAsInHeap("root class");
bigbang.addRootClass(Object[].class, false, false).registerAsInHeap("root class");

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

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

GraphBuilderConfiguration.Plugins plugins = new GraphBuilderConfiguration.Plugins(new InvocationPlugins());
NoClassInitializationPlugin classInitializationPlugin = new NoClassInitializationPlugin();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@

package com.oracle.graal.pointsto.standalone;

import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ForkJoinPool;

import org.graalvm.compiler.options.OptionValues;

import com.oracle.graal.pointsto.PointsToAnalysis;
import com.oracle.graal.pointsto.api.HostVM;
import com.oracle.graal.pointsto.constraints.UnsupportedFeatures;
Expand All @@ -34,11 +40,6 @@
import com.oracle.graal.pointsto.meta.AnalysisUniverse;
import com.oracle.graal.pointsto.meta.HostedProviders;
import com.oracle.graal.pointsto.util.TimerCollection;
import org.graalvm.compiler.options.OptionValues;

import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ForkJoinPool;

public class StandalonePointsToAnalysis extends PointsToAnalysis {
private Set<AnalysisMethod> addedClinits = ConcurrentHashMap.newKeySet();
Expand Down
Loading