use of org.graalvm.compiler.nodes.Invoke in project graal by oracle.
the class ScopedPostOrderNodeIterator method processScope.
public void processScope() {
FixedNode current;
queue(currentScopeStart);
while ((current = nextQueuedNode()) != null) {
assert current.isAlive();
if (current instanceof Invoke) {
invoke((Invoke) current);
queueSuccessors(current);
} else if (current instanceof LoopBeginNode) {
queueLoopBeginSuccessors((LoopBeginNode) current);
} else if (current instanceof LoopExitNode) {
queueLoopExitSuccessors((LoopExitNode) current);
} else if (current instanceof LoopEndNode) {
// nothing todo
} else if (current instanceof AbstractMergeNode) {
queueSuccessors(current);
} else if (current instanceof FixedWithNextNode) {
queueSuccessors(current);
} else if (current instanceof EndNode) {
queueMerge((EndNode) current);
} else if (current instanceof ControlSinkNode) {
// nothing todo
} else if (current instanceof ControlSplitNode) {
queueSuccessors(current);
} else {
assert false : current;
}
}
}
use of org.graalvm.compiler.nodes.Invoke in project graal by oracle.
the class MultiTypeGuardInlineInfo method duplicateInvokeForInlining.
private static Invoke duplicateInvokeForInlining(StructuredGraph graph, Invoke invoke, AbstractMergeNode exceptionMerge, PhiNode exceptionObjectPhi, boolean useForInlining) {
Invoke result = (Invoke) invoke.asNode().copyWithInputs();
Node callTarget = result.callTarget().copyWithInputs();
result.asNode().replaceFirstInput(result.callTarget(), callTarget);
result.setUseForInlining(useForInlining);
JavaKind kind = invoke.asNode().getStackKind();
if (kind != JavaKind.Void) {
FrameState stateAfter = invoke.stateAfter();
stateAfter = stateAfter.duplicate(stateAfter.bci);
stateAfter.replaceFirstInput(invoke.asNode(), result.asNode());
result.setStateAfter(stateAfter);
}
if (invoke instanceof InvokeWithExceptionNode) {
assert exceptionMerge != null && exceptionObjectPhi != null;
InvokeWithExceptionNode invokeWithException = (InvokeWithExceptionNode) invoke;
ExceptionObjectNode exceptionEdge = (ExceptionObjectNode) invokeWithException.exceptionEdge();
FrameState stateAfterException = exceptionEdge.stateAfter();
ExceptionObjectNode newExceptionEdge = (ExceptionObjectNode) exceptionEdge.copyWithInputs();
// set new state (pop old exception object, push new one)
newExceptionEdge.setStateAfter(stateAfterException.duplicateModified(JavaKind.Object, JavaKind.Object, newExceptionEdge));
EndNode endNode = graph.add(new EndNode());
newExceptionEdge.setNext(endNode);
exceptionMerge.addForwardEnd(endNode);
exceptionObjectPhi.addInput(newExceptionEdge);
((InvokeWithExceptionNode) result).setExceptionEdge(newExceptionEdge);
}
return result;
}
use of org.graalvm.compiler.nodes.Invoke in project graal by oracle.
the class AbstractInliningPolicy method determineInvokeProbability.
protected static double determineInvokeProbability(InlineInfo info) {
double invokeProbability = 0;
for (int i = 0; i < info.numberOfMethods(); i++) {
Inlineable callee = info.inlineableElementAt(i);
Iterable<Invoke> invokes = callee.getInvokes();
if (invokes.iterator().hasNext()) {
for (Invoke invoke : invokes) {
invokeProbability += callee.getProbability(invoke);
}
}
}
return invokeProbability;
}
use of org.graalvm.compiler.nodes.Invoke in project graal by oracle.
the class VerifyCallerSensitiveMethods method verify.
@Override
protected boolean verify(StructuredGraph graph, PhaseContext context) {
Invoke invoke = callsReflectionGetCallerClass(graph, context);
Annotation annotation = graph.method().getAnnotation(callerSensitiveClass);
if (invoke != null) {
if (annotation == null) {
StackTraceElement e = graph.method().asStackTraceElement(invoke.bci());
throw new VerificationError(String.format("%s: method that calls Reflection.getCallerClass() must be annotated with @CallerSensitive", e));
}
} else if (annotation != null) {
throw new VerificationError(String.format("%s: method annotated with @CallerSensitive does not call Reflection.getCallerClass()", graph.method().format("%H.%n(%p)")));
}
return true;
}
Aggregations