use of org.graalvm.compiler.graph.Node in project graal by oracle.
the class SubstrateGraphBuilderPlugins method registerEdgesPlugins.
private static void registerEdgesPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins, boolean analysis) {
if (analysis) {
Registration r = new Registration(plugins, Edges.class).setAllowOverwrite(true);
for (Class<?> c : new Class<?>[] { Node.class, NodeList.class }) {
r.register2("get" + c.getSimpleName() + "Unsafe", Node.class, long.class, new InvocationPlugin() {
@Override
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode node, ValueNode offset) {
b.addPush(JavaKind.Object, new //
AnalysisUnsafePartitionLoadNode(//
node, //
offset, //
JavaKind.Object, LocationIdentity.any(), GraalEdgeUnsafePartition.get(), metaAccess.lookupJavaType(c)));
return true;
}
});
r.register3("put" + c.getSimpleName() + "Unsafe", Node.class, long.class, c, new InvocationPlugin() {
@Override
public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode node, ValueNode offset, ValueNode value) {
b.add(new AnalysisUnsafePartitionStoreNode(node, offset, value, JavaKind.Object, LocationIdentity.any(), GraalEdgeUnsafePartition.get(), metaAccess.lookupJavaType(c)));
return true;
}
});
}
}
}
use of org.graalvm.compiler.graph.Node in project graal by oracle.
the class StrengthenStampsPhase method run.
@Override
protected void run(StructuredGraph graph) {
for (Node n : graph.getNodes()) {
if (n instanceof ValueNode && !(n instanceof LimitedValueProxy) && !(n instanceof PhiNode)) {
/*
* The stamp of proxy nodes and phi nodes is inferred automatically, so we do not
* need to improve them.
*/
ValueNode node = (ValueNode) n;
/*
* First ask the node to improve the stamp itself, to incorporate already improved
* input stamps.
*/
node.inferStamp();
Stamp newStamp = strengthen(node.stamp(NodeView.DEFAULT));
if (newStamp != null) {
node.setStamp(newStamp);
}
}
if (n instanceof LoadFieldNode) {
LoadFieldNode node = (LoadFieldNode) n;
updateStamp(node, toHosted(node.field()).getFieldTypeProfile());
} else if (n instanceof InstanceOfNode) {
InstanceOfNode node = (InstanceOfNode) n;
ObjectStamp newStamp = (ObjectStamp) strengthen(node.getCheckedStamp());
if (newStamp != null) {
node.strengthenCheckedStamp(newStamp);
}
} else if (n instanceof PiNode) {
PiNode node = (PiNode) n;
Stamp newStamp = strengthen(node.piStamp());
if (newStamp != null) {
node.strengthenPiStamp(newStamp);
}
}
}
}
use of org.graalvm.compiler.graph.Node in project graal by oracle.
the class AssertValueNode method insert.
protected static void insert(ValueNode input, AssertValueNode assertionNode) {
StructuredGraph graph = input.graph();
/* Find the insertion point where we want to add the assertion node. */
FixedWithNextNode insertionPoint;
if (input instanceof ParameterNode) {
insertionPoint = graph.start();
} else if (input instanceof InvokeWithExceptionNode) {
insertionPoint = ((InvokeWithExceptionNode) input).next();
} else if (input instanceof FixedWithNextNode) {
insertionPoint = (FixedWithNextNode) input;
} else {
throw shouldNotReachHere("Node is not fixed: " + input);
}
/*
* When inserting after an invoke that is also a loop exit, a proxy node is inserted between
* the invoke and every usage. We need to be after this proxy node to avoid unschedulable
* graphs.
*/
ProxyNode proxyUsage = null;
boolean otherUsages = false;
for (Node usage : input.usages()) {
if (usage instanceof ProxyNode && ((ProxyNode) usage).proxyPoint() == insertionPoint) {
assert proxyUsage == null : "can have only one proxy";
proxyUsage = (ProxyNode) usage;
} else if (!(usage instanceof FrameState)) {
otherUsages = true;
}
}
assert proxyUsage == null || otherUsages == false : "cannot have other usages when having a proxy usage";
ValueNode assertInput = proxyUsage != null ? proxyUsage : input;
/*
* Replace the object at usages. We do not process usages at the frame state because it
* could be the stateAfter() of the insertion point. Since frame states are not doing
* anything in code, this is not a loss of assertion precision.
*/
for (Node usage : assertInput.usages().snapshot()) {
if (!(usage instanceof FrameState)) {
usage.replaceFirstInput(assertInput, assertionNode);
}
}
/*
* Set the input object of the assertion node, now that all other usages have been replaced.
*/
assertionNode.updateUsages(assertionNode.input, assertInput);
assertionNode.input = assertInput;
/* Insert assertion node in graph. */
graph.addAfterFixed(insertionPoint, assertionNode);
}
use of org.graalvm.compiler.graph.Node in project graal by oracle.
the class ArrayCopyIntrinsificationTest method getCode.
@Override
protected InstalledCode getCode(ResolvedJavaMethod method, StructuredGraph g, boolean forceCompile, boolean installAsDefault, OptionValues options) {
StructuredGraph graph = g == null ? parseForCompile(method) : g;
int nodeCount = graph.getNodeCount();
InstalledCode result = super.getCode(method, graph, forceCompile, installAsDefault, options);
boolean graphWasProcessed = nodeCount != graph.getNodeCount();
if (graphWasProcessed) {
if (mustIntrinsify) {
for (Node node : graph.getNodes()) {
if (node instanceof Invoke) {
Invoke invoke = (Invoke) node;
Assert.assertTrue(invoke.callTarget() instanceof DirectCallTargetNode);
LoweredCallTargetNode directCall = (LoweredCallTargetNode) invoke.callTarget();
JavaMethod callee = directCall.targetMethod();
if (callee.getDeclaringClass().equals(getMetaAccess().lookupJavaType(System.class)) && callee.getName().equals("arraycopy")) {
// A partial snippet (e.g., ArrayCopySnippets.checkcastArraycopy) may
// call the original arraycopy method
} else {
Assert.assertTrue(callee.toString(), callee.getName().equals("<init>"));
Assert.assertTrue(getMetaAccess().lookupJavaType(ArrayIndexOutOfBoundsException.class).equals(callee.getDeclaringClass()) || getMetaAccess().lookupJavaType(NullPointerException.class).equals(callee.getDeclaringClass()));
}
}
}
} else {
boolean found = false;
for (Node node : graph.getNodes()) {
if (node instanceof Invoke) {
Invoke invoke = (Invoke) node;
LoweredCallTargetNode directCall = (LoweredCallTargetNode) invoke.callTarget();
JavaMethod callee = directCall.targetMethod();
if (callee.getDeclaringClass().equals(getMetaAccess().lookupJavaType(System.class)) && callee.getName().equals("arraycopy")) {
found = true;
} else {
fail("found invoke to some method other than arraycopy: " + callee);
}
}
}
Assert.assertTrue("did not find invoke to arraycopy", found);
}
}
return result;
}
use of org.graalvm.compiler.graph.Node in project graal by oracle.
the class AMD64HotSpotAddressLowering method tryOptimize.
private static void tryOptimize(OffsetAddressNode offsetAddress, LoopEx loop) {
EconomicMap<Node, InductionVariable> ivs = loop.getInductionVariables();
InductionVariable currentIV = ivs.get(offsetAddress.getOffset());
while (currentIV != null) {
if (!(currentIV instanceof DerivedInductionVariable)) {
break;
}
ValueNode currentValue = currentIV.valueNode();
if (currentValue.isDeleted()) {
break;
}
if (currentValue instanceof ZeroExtendNode) {
ZeroExtendNode zeroExtendNode = (ZeroExtendNode) currentValue;
if (applicableToImplicitZeroExtend(zeroExtendNode)) {
ValueNode input = zeroExtendNode.getValue();
if (input instanceof AddNode) {
AddNode add = (AddNode) input;
if (add.getX().isConstant()) {
optimizeAdd(zeroExtendNode, (ConstantNode) add.getX(), add.getY(), loop);
} else if (add.getY().isConstant()) {
optimizeAdd(zeroExtendNode, (ConstantNode) add.getY(), add.getX(), loop);
}
}
}
}
currentIV = ((DerivedInductionVariable) currentIV).getBase();
}
}
Aggregations