Mercurial > hg > truffle
changeset 10624:cb2d97f002d4
Merge
author | Christos Kotselidis <christos.kotselidis@oracle.com> |
---|---|
date | Sun, 07 Jul 2013 21:30:00 +0200 |
parents | 13c6440ac750 (current diff) f84ea5453961 (diff) |
children | 3c2a77f01e89 ca3865947682 8660a090c3e2 |
files | |
diffstat | 2 files changed, 27 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCache.java Sun Jul 07 19:44:38 2013 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCache.java Sun Jul 07 21:30:00 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,36 +124,43 @@ 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); PartialEscapePhase partialEscapePhase = new PartialEscapePhase(false, new CanonicalizerPhase(true)); partialEscapePhase.apply(newGraph, context); - if (newGraph.getNodeCount() > maxNodes && TruffleCompilerOptions.TraceTruffleCacheDetails.getValue()) { + if (newGraph.getNodeCount() > maxNodes && (TruffleCompilerOptions.TraceTruffleCacheDetails.getValue() || TruffleCompilerOptions.TraceTrufflePerformanceWarnings.getValue())) { TTY.println(String.format("[truffle] PERFORMANCE WARNING: method %s got too large with %d nodes.", newGraph.method(), newGraph.getNodeCount())); } } + 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<AbstractBeginNode> 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<StructuredGraph>() { public StructuredGraph call() { @@ -223,7 +237,7 @@ return fixedNode; } } - return invoke.next(); + return invoke.asNode(); } private StructuredGraph parseGraph(ResolvedJavaMethod method) {
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerOptions.java Sun Jul 07 19:44:38 2013 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerOptions.java Sun Jul 07 21:30:00 2013 +0200 @@ -64,6 +64,8 @@ @Option(help = "") public static final OptionValue<Boolean> TraceTruffleCacheDetails = new OptionValue<>(false); @Option(help = "") + public static final OptionValue<Boolean> TraceTrufflePerformanceWarnings = new OptionValue<>(false); + @Option(help = "") public static final OptionValue<Boolean> TruffleInlinePrinter = new OptionValue<>(false); @Option(help = "") public static final OptionValue<Boolean> TraceTruffleCompilationExceptions = new OptionValue<>(true);