# HG changeset patch # User Thomas Wuerthinger # Date 1373210413 -7200 # Node ID f84ea5453961cd128e4130daae45c494c0e4c582 # Parent 7220a8568e8c689223fe65e2cbd1df65f66742a9 Fixes for Truffle cache. diff -r 7220a8568e8c -r f84ea5453961 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCache.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCache.java Sat Jul 06 12:20:23 2013 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCache.java Sun Jul 07 17:20:13 2013 +0200 @@ -33,6 +33,7 @@ import com.oracle.graal.debug.*; import com.oracle.graal.debug.internal.*; import com.oracle.graal.graph.*; +import com.oracle.graal.graph.Node; import com.oracle.graal.java.*; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.java.*; @@ -44,6 +45,7 @@ import com.oracle.graal.phases.tiers.*; import com.oracle.graal.truffle.phases.*; import com.oracle.graal.virtual.phases.ea.*; +import com.oracle.truffle.api.nodes.*; /** * Implementation of a cache for Truffle graphs for improving partial evaluation time. @@ -122,25 +124,20 @@ Integer maxNodes = TruffleCompilerOptions.TruffleOperationCacheMaxNodes.getValue(); + contractGraph(newGraph, eliminate, convertDeoptimizeToGuardPhase, canonicalizerPhase); + while (newGraph.getNodeCount() <= maxNodes) { int mark = newGraph.getMark(); expandGraph(newGraph, maxNodes); - // Canonicalize / constant propagate. - canonicalizerPhase.apply(newGraph); - - // Convert deopt to guards. - convertDeoptimizeToGuardPhase.apply(newGraph); - - // Conditional elimination. - eliminate.apply(newGraph); - if (newGraph.getNewNodes(mark).count() == 0) { // No progress => exit iterative optimization. break; } + + contractGraph(newGraph, eliminate, convertDeoptimizeToGuardPhase, canonicalizerPhase); } HighTierContext context = new HighTierContext(metaAccessProvider, assumptions, replacements); @@ -152,6 +149,18 @@ } } + private static void contractGraph(StructuredGraph newGraph, ConditionalEliminationPhase eliminate, ConvertDeoptimizeToGuardPhase convertDeoptimizeToGuardPhase, + CanonicalizerPhase.Instance canonicalizerPhase) { + // Canonicalize / constant propagate. + canonicalizerPhase.apply(newGraph); + + // Convert deopt to guards. + convertDeoptimizeToGuardPhase.apply(newGraph); + + // Conditional elimination. + eliminate.apply(newGraph); + } + private void expandGraph(StructuredGraph newGraph, int maxNodes) { NodeBitMap visitedNodes = newGraph.createNodeBitMap(true); Queue workQueue = new LinkedList<>(); @@ -208,6 +217,11 @@ final MethodCallTargetNode methodCallTargetNode = (MethodCallTargetNode) invoke.callTarget(); if ((methodCallTargetNode.invokeKind() == InvokeKind.Special || methodCallTargetNode.invokeKind() == InvokeKind.Static) && !Modifier.isNative(methodCallTargetNode.targetMethod().getModifiers())) { + if (methodCallTargetNode.targetMethod().getAnnotation(ExplodeLoop.class) != null) { + // Do not inline explode loop methods, they need canonicalization and forced + // unrolling. + return invoke.asNode(); + } StructuredGraph inlinedGraph = Debug.scope("ExpandInvoke", methodCallTargetNode.targetMethod(), new Callable() { public StructuredGraph call() { @@ -223,7 +237,7 @@ return fixedNode; } } - return invoke.next(); + return invoke.asNode(); } private StructuredGraph parseGraph(ResolvedJavaMethod method) {