use of org.graalvm.compiler.nodes.InvokeNode in project graal by oracle.
the class CompileQueue method insertDeoptTests.
/**
* Inserts a call to {@link DeoptTester#deoptTest} right after FixedWithNextNode StateSplits.
*
* @param method method that is being augmented with deopt test calls
* @param graph The graph of a deoptimizable method or the corresponding deopt target method.
*/
private static void insertDeoptTests(HostedMethod method, StructuredGraph graph) {
for (Node node : graph.getNodes()) {
if (node instanceof FixedWithNextNode && node instanceof StateSplit && !(node instanceof InvokeNode) && !(node instanceof ForeignCallNode) && !(node instanceof DeoptTestNode) && !(method.isSynchronized() && node instanceof StartNode)) {
FixedWithNextNode fixedWithNext = (FixedWithNextNode) node;
FixedNode next = fixedWithNext.next();
DeoptTestNode testNode = graph.add(new DeoptTestNode());
fixedWithNext.setNext(null);
testNode.setNext(next);
fixedWithNext.setNext(testNode);
}
}
}
use of org.graalvm.compiler.nodes.InvokeNode in project graal by oracle.
the class DefaultLoopPolicies method shouldPartiallyUnroll.
@Override
public boolean shouldPartiallyUnroll(LoopEx loop) {
LoopBeginNode loopBegin = loop.loopBegin();
if (!loop.isCounted()) {
loopBegin.getDebug().log(DebugContext.VERBOSE_LEVEL, "shouldPartiallyUnroll %s isn't counted", loopBegin);
return false;
}
OptionValues options = loop.entryPoint().getOptions();
int maxNodes = Options.ExactPartialUnrollMaxNodes.getValue(options);
maxNodes = Math.min(maxNodes, Math.max(0, MaximumDesiredSize.getValue(options) - loop.loopBegin().graph().getNodeCount()));
int size = Math.max(1, loop.size() - 1 - loop.loopBegin().phis().count());
int unrollFactor = loopBegin.getUnrollFactor();
if (unrollFactor == 1) {
double loopFrequency = loopBegin.loopFrequency();
if (loopBegin.isSimpleLoop() && loopFrequency < 5.0) {
loopBegin.getDebug().log(DebugContext.VERBOSE_LEVEL, "shouldPartiallyUnroll %s frequency too low %s ", loopBegin, loopFrequency);
return false;
}
loopBegin.setLoopOrigFrequency(loopFrequency);
}
int maxUnroll = Options.UnrollMaxIterations.getValue(options);
// Now correct size for the next unroll. UnrollMaxIterations == 1 means perform the
// pre/main/post transformation but don't actually unroll the main loop.
size += size;
if (maxUnroll == 1 && loopBegin.isSimpleLoop() || size <= maxNodes && unrollFactor < maxUnroll) {
// Will the next unroll fit?
if ((int) loopBegin.loopOrigFrequency() < (unrollFactor * 2)) {
return false;
}
// Check whether we're allowed to unroll this loop
for (Node node : loop.inside().nodes()) {
if (node instanceof ControlFlowAnchorNode) {
return false;
}
if (node instanceof InvokeNode) {
return false;
}
}
return true;
} else {
loopBegin.getDebug().log(DebugContext.VERBOSE_LEVEL, "shouldPartiallyUnroll %s unrolled loop is too large %s ", loopBegin, size);
return false;
}
}
use of org.graalvm.compiler.nodes.InvokeNode in project graal by oracle.
the class MethodHandlePlugin method handleInvoke.
@Override
public boolean handleInvoke(GraphBuilderContext b, ResolvedJavaMethod method, ValueNode[] args) {
IntrinsicMethod intrinsicMethod = methodHandleAccess.lookupMethodHandleIntrinsic(method);
if (intrinsicMethod != null) {
InvokeKind invokeKind = b.getInvokeKind();
if (invokeKind != InvokeKind.Static) {
args[0] = b.nullCheckedValue(args[0]);
}
StampPair invokeReturnStamp = b.getInvokeReturnStamp(b.getAssumptions());
MethodHandleNode.GraphAdder adder = new MethodHandleNode.GraphAdder(b.getGraph()) {
@Override
public <T extends ValueNode> T add(T node) {
return b.add(node);
}
};
InvokeNode invoke = MethodHandleNode.tryResolveTargetInvoke(adder, methodHandleAccess, intrinsicMethod, method, b.bci(), invokeReturnStamp, args);
if (invoke == null) {
MethodHandleNode methodHandleNode = new MethodHandleNode(intrinsicMethod, invokeKind, method, b.bci(), invokeReturnStamp, args);
if (invokeReturnStamp.getTrustedStamp().getStackKind() == JavaKind.Void) {
b.add(methodHandleNode);
} else {
b.addPush(invokeReturnStamp.getTrustedStamp().getStackKind(), methodHandleNode);
}
} else {
CallTargetNode callTarget = invoke.callTarget();
NodeInputList<ValueNode> argumentsList = callTarget.arguments();
for (int i = 0; i < argumentsList.size(); ++i) {
argumentsList.initialize(i, b.append(argumentsList.get(i)));
}
boolean inlineEverything = false;
if (safeForDeoptimization) {
// If a MemberName suffix argument is dropped, the replaced call cannot
// deoptimized since the necessary frame state cannot be reconstructed.
// As such, it needs to recursively inline everything.
inlineEverything = args.length != argumentsList.size();
}
if (inlineEverything && !callTarget.targetMethod().hasBytecodes()) {
// we need to force-inline but we can not, leave the invoke as-is
return false;
}
b.handleReplacedInvoke(invoke.getInvokeKind(), callTarget.targetMethod(), argumentsList.toArray(new ValueNode[argumentsList.size()]), inlineEverything);
}
return true;
}
return false;
}
use of org.graalvm.compiler.nodes.InvokeNode in project graal by oracle.
the class CInterfaceEnumTool method createEnumLookupInvoke.
public ValueNode createEnumLookupInvoke(HostedGraphKit kit, ResolvedJavaType enumType, EnumInfo enumInfo, JavaKind parameterKind, ValueNode arg) {
InvokeNode invoke = invokeEnumLookup(kit, CallTargetFactory.from(kit), kit.getFrameState(), kit.bci(), enumInfo, parameterKind, arg);
ObjectStamp resultStamp = StampFactory.object(TypeReference.create(null, enumType), false);
return kit.unique(new PiNode(invoke, resultStamp));
}
use of org.graalvm.compiler.nodes.InvokeNode in project graal by oracle.
the class CInterfaceEnumTool method invokeEnumValue.
private InvokeNode invokeEnumValue(GraphBuilderTool b, CallTargetFactory callTargetFactory, FrameStateBuilder frameState, int bci, EnumInfo enumInfo, ResolvedJavaMethod valueMethod, ValueNode arg) {
ResolvedJavaType returnType = (ResolvedJavaType) valueMethod.getSignature().getReturnType(null);
ValueNode[] args = new ValueNode[2];
args[0] = ConstantNode.forConstant(snippetReflection.forObject(enumInfo.getRuntimeData()), b.getMetaAccess(), b.getGraph());
args[1] = arg;
StampPair returnStamp = StampFactory.forDeclaredType(null, returnType, false);
MethodCallTargetNode callTargetNode = b.append(callTargetFactory.createMethodCallTarget(InvokeKind.Virtual, valueMethod, args, returnStamp, bci));
Stamp invokeStamp = StampFactory.forKind(returnType.getJavaKind());
InvokeNode invoke = b.append(new InvokeNode(callTargetNode, bci, invokeStamp));
frameState.push(returnType.getJavaKind(), invoke);
FrameState stateWithInvoke = frameState.create(bci, invoke);
frameState.pop(returnType.getJavaKind());
invoke.setStateAfter(stateWithInvoke);
return invoke;
}
Aggregations