changeset 22488:f89487f1d185

Make deoptimization-safety optional in MethodHandlePlugin
author Christian Wimmer <christian.wimmer@oracle.com>
date Wed, 19 Aug 2015 16:05:14 -0700
parents 2d56522533a2
children 8b24fab0a573
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphBuilderPlugins.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/MethodHandlePlugin.java
diffstat 2 files changed, 11 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphBuilderPlugins.java	Wed Aug 19 16:03:54 2015 -0700
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotGraphBuilderPlugins.java	Wed Aug 19 16:05:14 2015 -0700
@@ -77,7 +77,7 @@
 
         plugins.appendParameterPlugin(nodePlugin);
         plugins.appendNodePlugin(nodePlugin);
-        plugins.appendNodePlugin(new MethodHandlePlugin(constantReflection.getMethodHandleAccess()));
+        plugins.appendNodePlugin(new MethodHandlePlugin(constantReflection.getMethodHandleAccess(), true));
 
         plugins.appendInlineInvokePlugin(replacements);
         if (InlineDuringParsing.getValue()) {
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/MethodHandlePlugin.java	Wed Aug 19 16:03:54 2015 -0700
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/MethodHandlePlugin.java	Wed Aug 19 16:05:14 2015 -0700
@@ -33,9 +33,11 @@
 
 public class MethodHandlePlugin implements NodePlugin {
     private final MethodHandleAccessProvider methodHandleAccess;
+    private final boolean safeForDeoptimization;
 
-    public MethodHandlePlugin(MethodHandleAccessProvider methodHandleAccess) {
+    public MethodHandlePlugin(MethodHandleAccessProvider methodHandleAccess, boolean safeForDeoptimization) {
         this.methodHandleAccess = methodHandleAccess;
+        this.safeForDeoptimization = safeForDeoptimization;
     }
 
     @Override
@@ -62,10 +64,13 @@
                     argumentsList.initialize(i, b.recursiveAppend(argumentsList.get(i)));
                 }
 
-                // If a MemberName suffix argument is dropped, the replaced call cannot
-                // deoptimized since the necessary frame state cannot be reconstructed.
-                // As such, it needs to recursively inline everything.
-                boolean inlineEverything = args.length != argumentsList.size();
+                boolean inlineEverything = false;
+                if (safeForDeoptimization) {
+                    // If a MemberName suffix argument is dropped, the replaced call cannot
+                    // deoptimized since the necessary frame state cannot be reconstructed.
+                    // As such, it needs to recursively inline everything.
+                    inlineEverything = args.length != argumentsList.size();
+                }
                 b.handleReplacedInvoke(invoke.getInvokeKind(), callTarget.targetMethod(), argumentsList.toArray(new ValueNode[argumentsList.size()]), inlineEverything);
             }
             return true;