# HG changeset patch # User Christian Humer # Date 1412868359 -7200 # Node ID 04d6bb76cfb36d98841f540691f8c63aa12e1e95 # Parent b725292b8a11106e86c275cab1999d8a620db240 Truffle: update callUntilOptimized to wait for the compilation and call it once optimized. diff -r b725292b8a11 -r 04d6bb76cfb3 graal/com.oracle.graal.truffle.test/sl/TestInliningMaxCallerSize.sl --- a/graal/com.oracle.graal.truffle.test/sl/TestInliningMaxCallerSize.sl Thu Oct 09 17:25:59 2014 +0200 +++ b/graal/com.oracle.graal.truffle.test/sl/TestInliningMaxCallerSize.sl Thu Oct 09 17:25:59 2014 +0200 @@ -20,10 +20,10 @@ function main() { originalMaxCallerSize = getOption("TruffleInliningMaxCallerSize"); setOption("TruffleInliningMaxCallerSize", 20); - waitForOptimization(callUntilOptimized(test1)); + callUntilOptimized(test1); assertTrue(isInlined(test1, test1, inlinableFunction), "inlinableFunction is not inlined"); - waitForOptimization(callUntilOptimized(test2)); + callUntilOptimized(test2); assertFalse(isInlined(test2, test2, notInlinableFunction), "notInlinableFunction is inlined"); setOption("TruffleInliningMaxCallerSize", originalMaxCallerSize); } diff -r b725292b8a11 -r 04d6bb76cfb3 graal/com.oracle.graal.truffle.test/sl/TestInliningRecursive1.sl --- a/graal/com.oracle.graal.truffle.test/sl/TestInliningRecursive1.sl Thu Oct 09 17:25:59 2014 +0200 +++ b/graal/com.oracle.graal.truffle.test/sl/TestInliningRecursive1.sl Thu Oct 09 17:25:59 2014 +0200 @@ -19,7 +19,7 @@ } function main() { - waitForOptimization(callUntilOptimized(test)); + callUntilOptimized(test); assertTrue(isInlined(test, test, fib), "fib is not inlined"); assertFalse(isInlined(test, fib, fib), "fib -> fib is not inlined"); } diff -r b725292b8a11 -r 04d6bb76cfb3 graal/com.oracle.graal.truffle.test/sl/TestInliningRecursive2.sl --- a/graal/com.oracle.graal.truffle.test/sl/TestInliningRecursive2.sl Thu Oct 09 17:25:59 2014 +0200 +++ b/graal/com.oracle.graal.truffle.test/sl/TestInliningRecursive2.sl Thu Oct 09 17:25:59 2014 +0200 @@ -27,7 +27,7 @@ } function main() { - waitForOptimization(callUntilOptimized(test)); + callUntilOptimized(test); assertTrue(isInlined(test, test, fib), "not inlined: test -> fib"); assertTrue(isInlined(test, fib, call), "not inlined: fib -> call"); diff -r b725292b8a11 -r 04d6bb76cfb3 graal/com.oracle.graal.truffle.test/sl/TestSlowPath01.sl --- a/graal/com.oracle.graal.truffle.test/sl/TestSlowPath01.sl Thu Oct 09 17:25:59 2014 +0200 +++ b/graal/com.oracle.graal.truffle.test/sl/TestSlowPath01.sl Thu Oct 09 17:25:59 2014 +0200 @@ -6,6 +6,6 @@ testSlowPath01(); } function main() { - waitForOptimization(callUntilOptimized(test1)); + callUntilOptimized(test1); assertTrue(isOptimized(test1), "inlinableFunction must be compiled properly"); } diff -r b725292b8a11 -r 04d6bb76cfb3 graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLCallUntilOptimizedBuiltin.java --- a/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLCallUntilOptimizedBuiltin.java Thu Oct 09 17:25:59 2014 +0200 +++ b/graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLCallUntilOptimizedBuiltin.java Thu Oct 09 17:25:59 2014 +0200 @@ -22,11 +22,15 @@ */ package com.oracle.graal.truffle.test.builtins; +import java.util.concurrent.*; + import com.oracle.graal.truffle.*; import com.oracle.truffle.api.*; +import com.oracle.truffle.api.CompilerDirectives.*; import com.oracle.truffle.api.dsl.*; import com.oracle.truffle.api.frame.*; import com.oracle.truffle.api.nodes.*; +import com.oracle.truffle.sl.*; import com.oracle.truffle.sl.runtime.*; /** @@ -45,15 +49,29 @@ @Child private IndirectCallNode indirectCall = Truffle.getRuntime().createIndirectCallNode(); @Specialization + @SlowPath public SLFunction callUntilCompiled(VirtualFrame frame, SLFunction function) { - OptimizedCallTarget oct = ((OptimizedCallTarget) function.getCallTarget()); + OptimizedCallTarget target = ((OptimizedCallTarget) function.getCallTarget()); for (int i = 0; i < MAX_CALLS; i++) { - if (((GraalTruffleRuntime) Truffle.getRuntime()).isCompiling(oct) || oct.isValid()) { + if (((GraalTruffleRuntime) Truffle.getRuntime()).isCompiling(target) || target.isValid()) { break; } else { - indirectCall.call(frame, oct, EMPTY_ARGS); + indirectCall.call(frame, target, EMPTY_ARGS); } } + try { + ((GraalTruffleRuntime) Truffle.getRuntime()).waitForCompilation(target, 640000); + } catch (ExecutionException | TimeoutException e) { + throw new RuntimeException(e); + } + + // call one more in compiled + indirectCall.call(frame, target, EMPTY_ARGS); + + if (!target.isValid()) { + throw new SLAssertionError("Function " + target + " invalidated."); + } + return function; } }