changeset 17600:6388d789b1d0

Invalidate all compiled methods that have a call target inlined on tree rewriting.
author Christian Wimmer <christian.wimmer@oracle.com>
date Wed, 15 Oct 2014 19:48:51 -0700
parents d3005ca4247f
children a9dc2307146f
files graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java
diffstat 2 files changed, 18 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java	Wed Oct 15 23:17:20 2014 +0100
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java	Wed Oct 15 19:48:51 2014 -0700
@@ -39,6 +39,7 @@
 import com.oracle.truffle.api.frame.*;
 import com.oracle.truffle.api.nodes.*;
 import com.oracle.truffle.api.nodes.Node;
+import com.oracle.truffle.api.utilities.*;
 
 /**
  * Call target that is optimized by Graal upon surpassing a specific invocation threshold.
@@ -66,6 +67,13 @@
 
     private TruffleInlining inlining;
 
+    /**
+     * When this call target is inlined, the inlining {@link InstalledCode} registers this
+     * assumption. It gets invalidated when a node rewriting is performed. This ensures that all
+     * compiled methods that have this call target inlined are properly invalidated.
+     */
+    private final CyclicAssumption nodeRewritingAssumption;
+
     public final RootNode getRootNode() {
         return rootNode;
     }
@@ -83,6 +91,11 @@
         } else {
             this.compilationProfile = new CompilationProfile();
         }
+        this.nodeRewritingAssumption = new CyclicAssumption("nodeRewritingAssumption of " + rootNode.toString());
+    }
+
+    public Assumption getNodeRewritingAssumption() {
+        return nodeRewritingAssumption.getAssumption();
     }
 
     public final void mergeArgumentStamp(TruffleStamp p) {
@@ -263,6 +276,8 @@
             compilationProfile.reportInvalidated();
             logOptimizedInvalidated(this, oldNode, newNode, reason);
         }
+        /* Notify compiled method that have inlined this call target that the tree changed. */
+        nodeRewritingAssumption.invalidate();
         cancelInstalledTask(oldNode, newNode, reason);
     }
 
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java	Wed Oct 15 23:17:20 2014 +0100
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java	Wed Oct 15 19:48:51 2014 -0700
@@ -51,6 +51,7 @@
 import com.oracle.graal.phases.common.inlining.info.*;
 import com.oracle.graal.phases.tiers.*;
 import com.oracle.graal.phases.util.*;
+import com.oracle.graal.truffle.nodes.*;
 import com.oracle.graal.truffle.nodes.asserts.*;
 import com.oracle.graal.truffle.nodes.frame.*;
 import com.oracle.graal.truffle.nodes.frame.NewFrameNode.VirtualOnlyInstanceNode;
@@ -395,6 +396,8 @@
                 graph = inliningCache.getCachedGraph(phaseContext, assumptions, decision);
             }
             decision.getProfile().setGraalDeepNodeCount(graph.getNodeCount());
+
+            assumptions.record(new AssumptionValidAssumption((OptimizedAssumption) decision.getTarget().getNodeRewritingAssumption()));
         } else {
             // we continue expansion of callDirect until we reach the callBoundary.
             graph = parseGraph(methodCallTargetNode.targetMethod(), methodCallTargetNode.arguments(), assumptions, phaseContext);