# HG changeset patch # User Gilles Duboscq # Date 1340619478 -7200 # Node ID 9bb0ba9e8ba67581de42a1a1416a207a33c69ce3 # Parent 5d06e32f10dfa05dd5fd281f03429ddcfa6ea126 Adjust loop unroll policy a bit Bailout in case unrolling goes very wrong Add FullUnroll metric In the gate, compile run* methods in product mode, not in fastdebug diff -r 5d06e32f10df -r 9bb0ba9e8ba6 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopPolicies.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopPolicies.java Fri Jun 22 17:27:36 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopPolicies.java Mon Jun 25 12:17:58 2012 +0200 @@ -44,6 +44,7 @@ } long exactTrips = loop.counted().constantMaxTripCount(); int maxNodes = Math.min(GraalOptions.FullUnrollMaxNodes, GraalOptions.MaximumDesiredSize - loop.loopBegin().graph().getNodeCount()); - return loop.size() * exactTrips <= maxNodes; + int size = Math.max(1, loop.size() - 1 - loop.loopBegin().phis().count()); + return size * exactTrips <= maxNodes; } } diff -r 5d06e32f10df -r 9bb0ba9e8ba6 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopTransformations.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopTransformations.java Fri Jun 22 17:27:36 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/loop/LoopTransformations.java Mon Jun 25 12:17:58 2012 +0200 @@ -23,11 +23,14 @@ package com.oracle.graal.compiler.loop; import com.oracle.graal.api.code.*; +import com.oracle.graal.compiler.*; import com.oracle.graal.compiler.phases.*; import com.oracle.graal.nodes.*; public abstract class LoopTransformations { + private static final int UNROLL_LIMIT = GraalOptions.FullUnrollMaxNodes * 2; + private LoopTransformations() { // does not need to be instantiated } @@ -46,12 +49,16 @@ public static void fullUnroll(LoopEx loop, CodeCacheProvider runtime) { //assert loop.isCounted(); //TODO (gd) strenghten : counted with known trip count + int iterations = 0; LoopBeginNode loopBegin = loop.loopBegin(); StructuredGraph graph = (StructuredGraph) loopBegin.graph(); while (!loopBegin.isDeleted()) { int mark = graph.getMark(); peel(loop); new CanonicalizerPhase(null, runtime, null, mark, null).apply(graph); + if (iterations++ > UNROLL_LIMIT || graph.getNodeCount() > GraalOptions.MaximumDesiredSize * 3) { + throw new BailoutException("FullUnroll : Graph seems to grow out of proportion"); + } } } diff -r 5d06e32f10df -r 9bb0ba9e8ba6 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LoopFullUnrollPhase.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LoopFullUnrollPhase.java Fri Jun 22 17:27:36 2012 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/phases/LoopFullUnrollPhase.java Mon Jun 25 12:17:58 2012 +0200 @@ -29,6 +29,7 @@ public class LoopFullUnrollPhase extends Phase { + private static final DebugMetric FULLY_UNROLLED_LOOPS = Debug.metric("FullUnrolls"); private final ExtendedRiRuntime runtime; public LoopFullUnrollPhase(ExtendedRiRuntime runtime) { @@ -47,6 +48,7 @@ if (LoopPolicies.shouldFullUnroll(loop)) { Debug.log("FullUnroll %s", loop); LoopTransformations.fullUnroll(loop, runtime); + FULLY_UNROLLED_LOOPS.increment(); Debug.dump(graph, "After fullUnroll %s", loop); peeled = true; break; diff -r 5d06e32f10df -r 9bb0ba9e8ba6 mx/commands.py --- a/mx/commands.py Fri Jun 22 17:27:36 2012 +0200 +++ b/mx/commands.py Mon Jun 25 12:17:58 2012 +0200 @@ -788,7 +788,7 @@ _jacoco = 'append' t = Task('JavaTesterTests:' + vmbuild) - jtt([]) + jtt(['@-XX:CompileCommand=exclude,*::run*'] if vmbuild == 'product' else []) tasks.append(t.stop()) if vmbuild == 'product' and args.jacocout is not None: