package org.graalvm.compiler.truffle.test;
import org.graalvm.compiler.core.common.CompilationIdentifier;
import org.graalvm.compiler.nodes.StructuredGraph;
import org.graalvm.compiler.truffle.compiler.PartialEvaluator;
import org.graalvm.compiler.truffle.compiler.phases.inlining.AgnosticInliningPhase;
import org.graalvm.compiler.truffle.runtime.OptimizedCallTarget;
import org.graalvm.compiler.truffle.runtime.OptimizedDirectCallNode;
import org.graalvm.compiler.truffle.runtime.TruffleInlining;
import org.graalvm.polyglot.Context;
import org.junit.Before;
import com.oracle.truffle.api.RootCallTarget;
import com.oracle.truffle.api.Truffle;
import com.oracle.truffle.api.TruffleRuntime;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.RootNode;
public class AgnosticInliningPhaseTest extends PartialEvaluationTest {
protected final TruffleRuntime runtime = Truffle.getRuntime();
@Before
public void before() {
setupContext(Context.newBuilder().allowAllAccess(true).allowExperimentalOptions(true).option("engine.LanguageAgnosticInlining", Boolean.TRUE.toString()).option("engine.InliningInliningBudget",
"1").build());
}
protected StructuredGraph runLanguageAgnosticInliningPhase(OptimizedCallTarget callTarget) {
final PartialEvaluator partialEvaluator = getTruffleCompiler(callTarget).getPartialEvaluator();
final CompilationIdentifier compilationIdentifier = new CompilationIdentifier() {
@Override
public String toString(Verbosity verbosity) {
return "";
}
};
final PartialEvaluator.Request request = partialEvaluator.new Request(callTarget.getOptionValues(), getDebugContext(), callTarget, partialEvaluator.rootForCallTarget(callTarget),
new TruffleInlining(),
compilationIdentifier, getSpeculationLog(), null);
final AgnosticInliningPhase agnosticInliningPhase = new AgnosticInliningPhase(partialEvaluator, request);
agnosticInliningPhase.apply(request.graph, getTruffleCompiler(callTarget).getPartialEvaluator().getProviders());
return request.graph;
}
protected final OptimizedCallTarget createDummyNode() {
return (OptimizedCallTarget) runtime.createCallTarget(new RootNode(null) {
@Override
public Object execute(VirtualFrame frame) {
return null;
}
});
}
protected class CallsInnerNodeTwice extends RootNode {
@Child private OptimizedDirectCallNode callNode1;
@Child private OptimizedDirectCallNode callNode2;
public CallsInnerNodeTwice(RootCallTarget toCall) {
super(null);
this.callNode1 = (OptimizedDirectCallNode) runtime.createDirectCallNode(toCall);
this.callNode2 = (OptimizedDirectCallNode) runtime.createDirectCallNode(toCall);
}
@Override
public Object execute(VirtualFrame frame) {
callNode1.call(frame.getArguments());
return callNode2.call(12345);
}
}
}