diff graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/TruffleGraphBuilderPlugins.java @ 20827:5bf195ce816a

New partial evaluator that works on encoded graphs (instead of on bytecodes)
author Christian Wimmer <christian.wimmer@oracle.com>
date Wed, 08 Apr 2015 22:38:40 -0700
parents c5ae0424f822
children 7c94786aad9a
line wrap: on
line diff
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/TruffleGraphBuilderPlugins.java	Wed Apr 08 22:07:50 2015 -0700
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/TruffleGraphBuilderPlugins.java	Wed Apr 08 22:38:40 2015 -0700
@@ -27,7 +27,6 @@
 import java.util.concurrent.*;
 
 import com.oracle.graal.api.meta.*;
-import com.oracle.graal.compiler.common.*;
 import com.oracle.graal.compiler.common.calc.*;
 import com.oracle.graal.compiler.common.type.*;
 import com.oracle.graal.graph.*;
@@ -50,24 +49,24 @@
  * Provides {@link InvocationPlugin}s for Truffle classes.
  */
 public class TruffleGraphBuilderPlugins {
-    public static void registerInvocationPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins) {
+    public static void registerInvocationPlugins(MetaAccessProvider metaAccess, InvocationPlugins plugins, boolean canDelayIntrinsification) {
 
-        registerOptimizedAssumptionPlugins(plugins);
+        registerOptimizedAssumptionPlugins(plugins, canDelayIntrinsification);
         registerExactMathPlugins(plugins);
         registerCompilerDirectivesPlugins(plugins);
-        registerCompilerAssertsPlugins(plugins);
+        registerCompilerAssertsPlugins(plugins, canDelayIntrinsification);
         registerOptimizedCallTargetPlugins(metaAccess, plugins);
-        registerUnsafeAccessImplPlugins(plugins);
+        registerUnsafeAccessImplPlugins(plugins, canDelayIntrinsification);
 
         if (TruffleCompilerOptions.TruffleUseFrameWithoutBoxing.getValue()) {
-            registerFrameWithoutBoxingPlugins(plugins);
+            registerFrameWithoutBoxingPlugins(plugins, canDelayIntrinsification);
         } else {
-            registerFrameWithBoxingPlugins(plugins);
+            registerFrameWithBoxingPlugins(plugins, canDelayIntrinsification);
         }
 
     }
 
-    public static void registerOptimizedAssumptionPlugins(InvocationPlugins plugins) {
+    public static void registerOptimizedAssumptionPlugins(InvocationPlugins plugins, boolean canDelayIntrinsification) {
         Registration r = new Registration(plugins, OptimizedAssumption.class);
         InvocationPlugin plugin = new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver) {
@@ -89,10 +88,12 @@
                             b.add(new DeoptimizeNode(DeoptimizationAction.InvalidateRecompile, DeoptimizationReason.None));
                         }
                     }
+                    return true;
+                } else if (canDelayIntrinsification) {
+                    return false;
                 } else {
                     throw b.bailout("assumption could not be reduced to a constant");
                 }
-                return true;
             }
         };
         r.register1("isValid", Receiver.class, plugin);
@@ -204,7 +205,7 @@
         });
     }
 
-    public static void registerCompilerAssertsPlugins(InvocationPlugins plugins) {
+    public static void registerCompilerAssertsPlugins(InvocationPlugins plugins, boolean canDelayIntrinsification) {
         Registration r = new Registration(plugins, CompilerAsserts.class);
         r.register1("partialEvaluationConstant", Object.class, new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode value) {
@@ -215,6 +216,8 @@
                 }
                 if (curValue.isConstant()) {
                     return true;
+                } else if (canDelayIntrinsification) {
+                    return false;
                 } else {
                     StringBuilder sb = new StringBuilder();
                     sb.append(curValue);
@@ -235,10 +238,13 @@
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode message) {
                 if (message.isConstant()) {
                     String messageString = message.asConstant().toValueString();
-                    b.add(new NeverPartOfCompilationNode(messageString));
+                    b.add(new NeverPartOfCompilationNode(messageString, b.createStateAfter()));
                     return true;
+                } else if (canDelayIntrinsification) {
+                    return false;
+                } else {
+                    throw b.bailout("message for never part of compilation is non-constant");
                 }
-                throw b.bailout("message for never part of compilation is non-constant");
             }
         });
     }
@@ -260,22 +266,22 @@
         });
     }
 
-    public static void registerFrameWithoutBoxingPlugins(InvocationPlugins plugins) {
+    public static void registerFrameWithoutBoxingPlugins(InvocationPlugins plugins, boolean canDelayIntrinsification) {
         Registration r = new Registration(plugins, FrameWithoutBoxing.class);
         registerMaterialize(r);
-        registerUnsafeCast(r);
+        registerUnsafeCast(r, canDelayIntrinsification);
         registerUnsafeLoadStorePlugins(r, Kind.Int, Kind.Long, Kind.Float, Kind.Double, Kind.Object);
     }
 
-    public static void registerFrameWithBoxingPlugins(InvocationPlugins plugins) {
+    public static void registerFrameWithBoxingPlugins(InvocationPlugins plugins, boolean canDelayIntrinsification) {
         Registration r = new Registration(plugins, FrameWithBoxing.class);
         registerMaterialize(r);
-        registerUnsafeCast(r);
+        registerUnsafeCast(r, canDelayIntrinsification);
     }
 
-    public static void registerUnsafeAccessImplPlugins(InvocationPlugins plugins) {
+    public static void registerUnsafeAccessImplPlugins(InvocationPlugins plugins, boolean canDelayIntrinsification) {
         Registration r = new Registration(plugins, UnsafeAccessImpl.class);
-        registerUnsafeCast(r);
+        registerUnsafeCast(r, canDelayIntrinsification);
         registerUnsafeLoadStorePlugins(r, Kind.Boolean, Kind.Byte, Kind.Int, Kind.Short, Kind.Long, Kind.Float, Kind.Double, Kind.Object);
     }
 
@@ -288,7 +294,7 @@
         });
     }
 
-    private static void registerUnsafeCast(Registration r) {
+    private static void registerUnsafeCast(Registration r, boolean canDelayIntrinsification) {
         r.register4("unsafeCast", Object.class, Class.class, boolean.class, boolean.class, new InvocationPlugin() {
             public boolean apply(GraphBuilderContext b, ResolvedJavaMethod targetMethod, Receiver receiver, ValueNode object, ValueNode clazz, ValueNode condition, ValueNode nonNull) {
                 if (clazz.isConstant() && nonNull.isConstant()) {
@@ -322,8 +328,11 @@
                         b.addPush(Kind.Object, new PiNode(object, piStamp, valueAnchorNode));
                     }
                     return true;
+                } else if (canDelayIntrinsification) {
+                    return false;
+                } else {
+                    throw b.bailout("unsafeCast arguments could not reduce to a constant: " + clazz + ", " + nonNull);
                 }
-                throw GraalInternalError.shouldNotReachHere("unsafeCast arguments could not reduce to a constant: " + clazz + ", " + nonNull);
             }
         });
     }
@@ -359,7 +368,7 @@
                 b.addPush(returnKind.getStackKind(), b.add(new UnsafeLoadNode(object, offset, returnKind, locationIdentity, compare)));
                 return true;
             }
-            // TODO: should we throw GraalInternalError.shouldNotReachHere() here?
+            // TODO: should we throw b.bailout() here?
             return false;
         }
     }
@@ -385,7 +394,7 @@
                 b.add(new UnsafeStoreNode(object, offset, value, kind, locationIdentity, null));
                 return true;
             }
-            // TODO: should we throw GraalInternalError.shouldNotReachHere() here?
+            // TODO: should we throw b.bailout() here?
             return false;
         }
     }