Mercurial > hg > truffle
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);