changeset 22058:555c6a8db46b

added support for forced recursive inlining when a MethodHandle intrinsic is replaced with a resolved target and the MemberName suffix is dropped from the replacement invocation
author Doug Simon <doug.simon@oracle.com>
date Tue, 23 Jun 2015 01:43:52 +0200
parents 62fa6ad33667
children a694f0c9864f
files graal/com.oracle.graal.graphbuilderconf/src/com/oracle/graal/graphbuilderconf/GraphBuilderContext.java graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParser.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/IntrinsicGraphBuilder.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/MethodHandlePlugin.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/PEGraphDecoder.java
diffstat 5 files changed, 27 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.graphbuilderconf/src/com/oracle/graal/graphbuilderconf/GraphBuilderContext.java	Tue Jun 23 01:16:35 2015 +0200
+++ b/graal/com.oracle.graal.graphbuilderconf/src/com/oracle/graal/graphbuilderconf/GraphBuilderContext.java	Tue Jun 23 01:43:52 2015 +0200
@@ -120,8 +120,10 @@
      * @param invokeKind the kind of the replacement invocation
      * @param targetMethod the target of the replacement invocation
      * @param args the arguments to the replacement invocation
+     * @param forceInlineEverything specifies if all invocations encountered in the scope of
+     *            handling the replaced invoke are to be force inlined
      */
-    void handleReplacedInvoke(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args);
+    void handleReplacedInvoke(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args, boolean forceInlineEverything);
 
     /**
      * Intrinsifies an invocation of a given method by inlining the bytecodes of a given
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParser.java	Tue Jun 23 01:16:35 2015 +0200
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/BytecodeParser.java	Tue Jun 23 01:43:52 2015 +0200
@@ -1244,8 +1244,16 @@
         return currentInvokeReturnType;
     }
 
-    public void handleReplacedInvoke(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args) {
-        appendInvoke(invokeKind, targetMethod, args);
+    private boolean forceInliningEverything;
+
+    public void handleReplacedInvoke(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args, boolean inlineEverything) {
+        boolean previous = forceInliningEverything;
+        forceInliningEverything = previous || inlineEverything;
+        try {
+            appendInvoke(invokeKind, targetMethod, args);
+        } finally {
+            forceInliningEverything = previous;
+        }
     }
 
     private void appendInvoke(InvokeKind initialInvokeKind, ResolvedJavaMethod initialTargetMethod, ValueNode[] args) {
@@ -1418,10 +1426,15 @@
     }
 
     private boolean tryInline(ValueNode[] args, ResolvedJavaMethod targetMethod, JavaType returnType) {
-        boolean canBeInlined = parsingIntrinsic() || targetMethod.canBeInlined();
+        boolean canBeInlined = forceInliningEverything || parsingIntrinsic() || targetMethod.canBeInlined();
         if (!canBeInlined) {
             return false;
         }
+
+        if (forceInliningEverything) {
+            return inline(targetMethod, targetMethod, false, args);
+        }
+
         for (InlineInvokePlugin plugin : graphBuilderConfig.getPlugins().getInlineInvokePlugins()) {
             InlineInfo inlineInfo = plugin.shouldInlineInvoke(this, targetMethod, args, returnType);
             if (inlineInfo != null) {
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/IntrinsicGraphBuilder.java	Tue Jun 23 01:16:35 2015 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/IntrinsicGraphBuilder.java	Tue Jun 23 01:43:52 2015 +0200
@@ -133,7 +133,7 @@
         returnValue = value;
     }
 
-    public void handleReplacedInvoke(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args) {
+    public void handleReplacedInvoke(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args, boolean forceInlineEverything) {
         throw JVMCIError.shouldNotReachHere();
     }
 
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/MethodHandlePlugin.java	Tue Jun 23 01:16:35 2015 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/MethodHandlePlugin.java	Tue Jun 23 01:43:52 2015 +0200
@@ -61,7 +61,12 @@
                 for (int i = 0; i < argumentsList.size(); ++i) {
                     argumentsList.initialize(i, b.recursiveAppend(argumentsList.get(i)));
                 }
-                b.handleReplacedInvoke(invoke.getInvokeKind(), callTarget.targetMethod(), argumentsList.toArray(new ValueNode[argumentsList.size()]));
+
+                // 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();
+                b.handleReplacedInvoke(invoke.getInvokeKind(), callTarget.targetMethod(), argumentsList.toArray(new ValueNode[argumentsList.size()]), inlineEverything);
             }
             return true;
         }
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/PEGraphDecoder.java	Tue Jun 23 01:16:35 2015 +0200
+++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/PEGraphDecoder.java	Tue Jun 23 01:43:52 2015 +0200
@@ -176,7 +176,7 @@
         }
 
         @Override
-        public void handleReplacedInvoke(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args) {
+        public void handleReplacedInvoke(InvokeKind invokeKind, ResolvedJavaMethod targetMethod, ValueNode[] args, boolean inlineEverything) {
             throw unimplemented();
         }