changeset 17405:04d6bb76cfb3

Truffle: update callUntilOptimized to wait for the compilation and call it once optimized.
author Christian Humer <christian.humer@gmail.com>
date Thu, 09 Oct 2014 17:25:59 +0200
parents b725292b8a11
children 1615d78a9d35
files graal/com.oracle.graal.truffle.test/sl/TestInliningMaxCallerSize.sl graal/com.oracle.graal.truffle.test/sl/TestInliningRecursive1.sl graal/com.oracle.graal.truffle.test/sl/TestInliningRecursive2.sl graal/com.oracle.graal.truffle.test/sl/TestSlowPath01.sl graal/com.oracle.graal.truffle.test/src/com/oracle/graal/truffle/test/builtins/SLCallUntilOptimizedBuiltin.java
diffstat 5 files changed, 26 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- 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);
 }  
--- 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");
 }  
--- 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");
--- 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");
 }  
--- 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;
     }
 }