use of com.oracle.truffle.api.Assumption in project graal by oracle.
the class OptimizedCallTargetTest method testRewriteAssumption.
@Test
public void testRewriteAssumption() {
String testName = "testRewriteAssumption";
assertTrue("test only works with inlining enabled", TruffleCompilerOptions.getValue(TruffleFunctionInlining));
try (TruffleOptionsOverrideScope s = TruffleCompilerOptions.overrideOptions(TruffleCompilerOptions.TruffleCompilationThreshold, 20)) {
final int compilationThreshold = TruffleCompilerOptions.getValue(TruffleCompilationThreshold);
assertTrue(compilationThreshold >= 2);
OptimizedCallTarget innermostCallTarget = (OptimizedCallTarget) runtime.createCallTarget(new RootTestNode(new FrameDescriptor(), testName + 0, new AbstractTestNode() {
@Child
private AbstractTestNode child = new ConstantTestNode(42);
@Child
private AbstractTestNode dummy = new ConstantTestNode(17);
@Override
public int execute(VirtualFrame frame) {
int k = (int) frame.getArguments()[0];
if (k > compilationThreshold) {
CompilerDirectives.transferToInterpreter();
dummy.replace(new ConstantTestNode(k));
}
return child.execute(frame);
}
}));
OptimizedCallTarget ct = innermostCallTarget;
ct = (OptimizedCallTarget) runtime.createCallTarget(new RootTestNode(new FrameDescriptor(), testName + 1, new CallTestNode(ct)));
ct = (OptimizedCallTarget) runtime.createCallTarget(new RootTestNode(new FrameDescriptor(), testName + 2, new CallTestNode(ct)));
final OptimizedCallTarget outermostCallTarget = ct;
assertNull("assumption is initially null", getRewriteAssumption(innermostCallTarget));
IntStream.range(0, compilationThreshold / 2).parallel().forEach(k -> {
assertEquals(42, outermostCallTarget.call(k));
assertNull("assumption stays null in the interpreter", getRewriteAssumption(innermostCallTarget));
});
outermostCallTarget.compile();
assertCompiled(outermostCallTarget);
Assumption firstRewriteAssumption = getRewriteAssumption(innermostCallTarget);
assertNotNull("assumption must not be null after compilation", firstRewriteAssumption);
assertTrue(firstRewriteAssumption.isValid());
List<Assumption> rewriteAssumptions = IntStream.range(0, 2 * compilationThreshold).parallel().mapToObj(k -> {
assertEquals(42, outermostCallTarget.call(k));
Assumption rewriteAssumptionAfter = getRewriteAssumption(innermostCallTarget);
assertNotNull("assumption must not be null after compilation", rewriteAssumptionAfter);
return rewriteAssumptionAfter;
}).collect(Collectors.toList());
Assumption finalRewriteAssumption = getRewriteAssumption(innermostCallTarget);
assertNotNull("assumption must not be null after compilation", finalRewriteAssumption);
assertNotSame(firstRewriteAssumption, finalRewriteAssumption);
assertFalse(firstRewriteAssumption.isValid());
assertTrue(finalRewriteAssumption.isValid());
assertFalse(rewriteAssumptions.stream().filter(a -> a != finalRewriteAssumption).anyMatch(Assumption::isValid));
}
}
use of com.oracle.truffle.api.Assumption in project graal by oracle.
the class OptimizedCompilationProfile method profileDirectCall.
@ExplodeLoop
void profileDirectCall(Object[] args) {
Assumption typesAssumption = profiledArgumentTypesAssumption;
if (typesAssumption == null) {
if (CompilerDirectives.inInterpreter()) {
initializeProfiledArgumentTypes(args);
}
} else {
Class<?>[] types = profiledArgumentTypes;
if (types != null) {
if (types.length != args.length) {
CompilerDirectives.transferToInterpreterAndInvalidate();
typesAssumption.invalidate();
profiledArgumentTypes = null;
} else if (typesAssumption.isValid()) {
for (int i = 0; i < types.length; i++) {
Class<?> type = types[i];
Object value = args[i];
if (type != null && (value == null || value.getClass() != type)) {
CompilerDirectives.transferToInterpreterAndInvalidate();
updateProfiledArgumentTypes(args, types);
break;
}
}
}
}
}
}
use of com.oracle.truffle.api.Assumption in project graal by oracle.
the class OptimizedCompilationProfile method profileReturnValue.
final void profileReturnValue(Object result) {
Assumption returnTypeAssumption = profiledReturnTypeAssumption;
if (CompilerDirectives.inInterpreter() && returnTypeAssumption == null) {
// for immediate compiles.
if (TruffleCompilerOptions.getValue(TruffleReturnTypeSpeculation)) {
profiledReturnType = classOf(result);
profiledReturnTypeAssumption = createValidAssumption("Profiled Return Type");
}
} else if (profiledReturnType != null) {
if (result == null || profiledReturnType != result.getClass()) {
CompilerDirectives.transferToInterpreterAndInvalidate();
returnTypeAssumption.invalidate();
profiledReturnType = null;
}
}
}
use of com.oracle.truffle.api.Assumption in project graal by oracle.
the class OptimizedCompilationProfile method profileIndirectCall.
void profileIndirectCall() {
Assumption argumentTypesAssumption = profiledArgumentTypesAssumption;
if (argumentTypesAssumption != null && argumentTypesAssumption.isValid()) {
// Argument profiling is not possible for targets of indirect calls.
CompilerDirectives.transferToInterpreter();
argumentTypesAssumption.invalidate();
profiledArgumentTypes = null;
}
}
use of com.oracle.truffle.api.Assumption in project graal by oracle.
the class AssumptionPartialEvaluationTest method assumptionBranchCutoff.
/**
* Tests whether a valid {@link Assumption} cuts off a non-executed branch.
*/
@Test
public void assumptionBranchCutoff() {
Assumption assumption = Truffle.getRuntime().createAssumption();
AssumptionCutsBranchTestNode result = new AssumptionCutsBranchTestNode(assumption);
RootTestNode rootNode = new RootTestNode(new FrameDescriptor(), "cutoffBranch", result);
OptimizedCallTarget compilable = compileHelper("cutoffBranch", rootNode, new Object[0]);
for (int i = 0; i < 100000; i++) {
Assert.assertEquals(0, compilable.call(new Object[0]));
}
Assert.assertNull(result.getChildNode());
}
Aggregations