# HG changeset patch # User Christian Wimmer # Date 1413427731 25200 # Node ID 6388d789b1d03bc8bad5b88419a0383d5c83fa70 # Parent d3005ca4247f4f96e13f5a27302876b667e08bbd Invalidate all compiled methods that have a call target inlined on tree rewriting. diff -r d3005ca4247f -r 6388d789b1d0 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/OptimizedCallTarget.java --- 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); } diff -r d3005ca4247f -r 6388d789b1d0 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/PartialEvaluator.java --- 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);