# HG changeset patch # User Christos Kotselidis # Date 1373225400 -7200 # Node ID cb2d97f002d443a75d28829b1ed76e0a24d5eaa2 # Parent 13c6440ac75007fd6ba458c7079c28ae38f2b989# Parent f84ea5453961cd128e4130daae45c494c0e4c582 Merge diff -r 13c6440ac750 -r cb2d97f002d4 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 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 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) { diff -r 13c6440ac750 -r cb2d97f002d4 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/TruffleCompilerOptions.java --- 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 TraceTruffleCacheDetails = new OptionValue<>(false); @Option(help = "") + public static final OptionValue TraceTrufflePerformanceWarnings = new OptionValue<>(false); + @Option(help = "") public static final OptionValue TruffleInlinePrinter = new OptionValue<>(false); @Option(help = "") public static final OptionValue TraceTruffleCompilationExceptions = new OptionValue<>(true);