changeset 22467:f999bdd4895a

Truffle: delay intrinsification of explicit bailout, so that GraphPE does the bailout during partial evaluation and not during parsing
author Christian Wimmer <christian.wimmer@oracle.com>
date Fri, 14 Aug 2015 17:34:58 -0700
parents e56b1fd502d8
children cdd5ff710208
files graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/TruffleGraphBuilderPlugins.java
diffstat 1 files changed, 23 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/TruffleGraphBuilderPlugins.java	Fri Aug 14 17:31:14 2015 -0700
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/TruffleGraphBuilderPlugins.java	Fri Aug 14 17:34:58 2015 -0700
@@ -36,8 +36,10 @@
 import com.oracle.graal.graphbuilderconf.InvocationPlugin.Receiver;
 import com.oracle.graal.graphbuilderconf.InvocationPlugins.Registration;
 import com.oracle.graal.nodes.*;
+import com.oracle.graal.nodes.CallTargetNode.InvokeKind;
 import com.oracle.graal.nodes.calc.*;
 import com.oracle.graal.nodes.extended.*;
+import com.oracle.graal.nodes.java.*;
 import com.oracle.graal.nodes.virtual.*;
 import com.oracle.graal.replacements.nodes.arithmetic.*;
 import com.oracle.graal.truffle.*;
@@ -56,7 +58,7 @@
 
         registerOptimizedAssumptionPlugins(plugins, snippetReflection);
         registerExactMathPlugins(plugins);
-        registerCompilerDirectivesPlugins(plugins);
+        registerCompilerDirectivesPlugins(plugins, canDelayIntrinsification);
         registerCompilerAssertsPlugins(plugins, canDelayIntrinsification);
         registerOptimizedCallTargetPlugins(metaAccess, plugins);
         registerUnsafeAccessImplPlugins(plugins, canDelayIntrinsification);
@@ -138,7 +140,7 @@
         }
     }
 
-    public static void registerCompilerDirectivesPlugins(InvocationPlugins plugins) {
+    public static void registerCompilerDirectivesPlugins(InvocationPlugins plugins, boolean canDelayIntrinsification) {
         Registration r = new Registration(plugins, CompilerDirectives.class);
         r.register0("inInterpreter", new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) {
@@ -182,6 +184,25 @@
         });
         r.register1("bailout", String.class, new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode message) {
+                if (canDelayIntrinsification) {
+                    /*
+                     * We do not want to bailout yet, since we are still parsing individual methods
+                     * and constant folding could still eliminate the call to bailout(). However, we
+                     * also want to stop parsing, since we are sure that we will never need the
+                     * graph beyond the bailout point.
+                     *
+                     * Therefore, we manually emit the call to bailout, which will be intrinsified
+                     * later when intrinsifications can no longer be delayed. The call is followed
+                     * by a NeverPartOfCompilationNode, which is a control sink and therefore stops
+                     * any further parsing.
+                     */
+                    CallTargetNode callTarget = b.add(new MethodCallTargetNode(InvokeKind.Static, targetMethod, new ValueNode[]{message}, targetMethod.getSignature().getReturnType(null), null));
+                    b.add(new InvokeNode(callTarget, b.bci()));
+
+                    b.add(new NeverPartOfCompilationNode("intrinsification of call to bailout() will abort entire compilation"));
+                    return true;
+                }
+
                 if (message.isConstant()) {
                     throw b.bailout(message.asConstant().toValueString());
                 }