changeset 19375:3d750310932f

Fix inline decisions in fast partial evaluator.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Sat, 14 Feb 2015 19:45:33 +0100
parents 2412408a4319
children 525d1e6067b7
files graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPlugins.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java
diffstat 3 files changed, 16 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Sat Feb 14 15:29:49 2015 +0100
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Sat Feb 14 19:45:33 2015 +0100
@@ -890,6 +890,7 @@
 
                     ResolvedJavaMethod inlinedTargetMethod = inlineInvokePlugin.inlinedMethod(this, targetMethod, args);
                     parseAndInlineCallee(inlinedTargetMethod, args);
+                    inlineInvokePlugin.postInline(inlinedTargetMethod);
                     return;
                 }
 
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPlugins.java	Sat Feb 14 15:29:49 2015 +0100
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPlugins.java	Sat Feb 14 19:45:33 2015 +0100
@@ -59,6 +59,10 @@
         }
 
         boolean shouldInlineInvoke(ResolvedJavaMethod method, int depth);
+
+        default void postInline(@SuppressWarnings("unused") ResolvedJavaMethod inlinedTargetMethod) {
+
+        }
     }
 
     public interface LoopExplosionPlugin extends GraphBuilderPlugin {
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java	Sat Feb 14 15:29:49 2015 +0100
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java	Sat Feb 14 19:45:33 2015 +0100
@@ -193,11 +193,12 @@
 
     private class InlineInvokePlugin implements GraphBuilderPlugins.InlineInvokePlugin {
 
-        private final TruffleInlining inlining;
+        private Stack<TruffleInlining> inlining;
         private OptimizedDirectCallNode lastDirectCallNode;
 
         public InlineInvokePlugin(TruffleInlining inlining) {
-            this.inlining = inlining;
+            this.inlining = new Stack<>();
+            this.inlining.push(inlining);
         }
 
         public ResolvedJavaMethod inlinedMethod(GraphBuilderContext builder, ResolvedJavaMethod original, ValueNode[] arguments) {
@@ -213,9 +214,10 @@
                     lastDirectCallNode = directCallNode;
                 }
             } else if (original.equals(callDirectMethod)) {
-                TruffleInliningDecision decision = getDecision(inlining, lastDirectCallNode);
+                TruffleInliningDecision decision = getDecision(inlining.peek(), lastDirectCallNode);
                 lastDirectCallNode = null;
                 if (decision != null && decision.isInline()) {
+                    inlining.push(decision);
                     builder.getAssumptions().record(new AssumptionValidAssumption((OptimizedAssumption) decision.getTarget().getNodeRewritingAssumption()));
                     return callInlinedMethod;
                 }
@@ -227,6 +229,12 @@
             return method.getAnnotation(TruffleBoundary.class) == null;
         }
 
+        public void postInline(ResolvedJavaMethod inlinedTargetMethod) {
+            if (inlinedTargetMethod.equals(callInlinedMethod)) {
+                inlining.pop();
+            }
+        }
+
     }
 
     private class LoopExplosionPlugin implements GraphBuilderPlugins.LoopExplosionPlugin {