< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop/src/org/graalvm/compiler/loop/DefaultLoopPolicies.java

Print this page

        

*** 53,72 **** --- 53,75 ---- import org.graalvm.compiler.options.OptionValues; import jdk.vm.ci.meta.MetaAccessProvider; public class DefaultLoopPolicies implements LoopPolicies { + + public static class Options { @Option(help = "", type = OptionType.Expert) public static final OptionKey<Integer> LoopUnswitchMaxIncrease = new OptionKey<>(500); @Option(help = "", type = OptionType.Expert) public static final OptionKey<Integer> LoopUnswitchTrivial = new OptionKey<>(10); @Option(help = "", type = OptionType.Expert) public static final OptionKey<Double> LoopUnswitchFrequencyBoost = new OptionKey<>(10.0); @Option(help = "", type = OptionType.Expert) public static final OptionKey<Integer> FullUnrollMaxNodes = new OptionKey<>(300); @Option(help = "", type = OptionType.Expert) public static final OptionKey<Integer> FullUnrollMaxIterations = new OptionKey<>(600); @Option(help = "", type = OptionType.Expert) public static final OptionKey<Integer> ExactFullUnrollMaxNodes = new OptionKey<>(1200); @Option(help = "", type = OptionType.Expert) public static final OptionKey<Integer> ExactPartialUnrollMaxNodes = new OptionKey<>(200); @Option(help = "", type = OptionType.Expert) public static final OptionKey<Integer> UnrollMaxIterations = new OptionKey<>(16); + } @Override public boolean shouldPeel(LoopEx loop, ControlFlowGraph cfg, MetaAccessProvider metaAccess) { LoopBeginNode loopBegin = loop.loopBegin(); double entryProbability = cfg.blockFor(loopBegin.forwardEnd()).probability();
*** 85,98 **** return false; } OptionValues options = loop.entryPoint().getOptions(); CountedLoopInfo counted = loop.counted(); long maxTrips = counted.constantMaxTripCount(); ! int maxNodes = (counted.isExactTripCount() && counted.isConstantExactTripCount()) ? ExactFullUnrollMaxNodes.getValue(options) : FullUnrollMaxNodes.getValue(options); maxNodes = Math.min(maxNodes, Math.max(0, MaximumDesiredSize.getValue(options) - loop.loopBegin().graph().getNodeCount())); int size = Math.max(1, loop.size() - 1 - loop.loopBegin().phis().count()); ! if (maxTrips <= FullUnrollMaxIterations.getValue(options) && size * (maxTrips - 1) <= maxNodes) { // check whether we're allowed to unroll this loop return loop.canDuplicateLoop(); } else { return false; } --- 88,101 ---- return false; } OptionValues options = loop.entryPoint().getOptions(); CountedLoopInfo counted = loop.counted(); long maxTrips = counted.constantMaxTripCount(); ! int maxNodes = (counted.isExactTripCount() && counted.isConstantExactTripCount()) ? Options.ExactFullUnrollMaxNodes.getValue(options) : Options.FullUnrollMaxNodes.getValue(options); maxNodes = Math.min(maxNodes, Math.max(0, MaximumDesiredSize.getValue(options) - loop.loopBegin().graph().getNodeCount())); int size = Math.max(1, loop.size() - 1 - loop.loopBegin().phis().count()); ! if (maxTrips <= Options.FullUnrollMaxIterations.getValue(options) && size * (maxTrips - 1) <= maxNodes) { // check whether we're allowed to unroll this loop return loop.canDuplicateLoop(); } else { return false; }
*** 104,114 **** if (!loop.isCounted()) { loopBegin.getDebug().log(DebugContext.VERBOSE_LEVEL, "shouldPartiallyUnroll %s isn't counted", loopBegin); return false; } OptionValues options = loop.entryPoint().getOptions(); ! int maxNodes = ExactPartialUnrollMaxNodes.getValue(options); maxNodes = Math.min(maxNodes, Math.max(0, MaximumDesiredSize.getValue(options) - loop.loopBegin().graph().getNodeCount())); int size = Math.max(1, loop.size() - 1 - loop.loopBegin().phis().count()); int unrollFactor = loopBegin.getUnrollFactor(); if (unrollFactor == 1) { double loopFrequency = loopBegin.loopFrequency(); --- 107,117 ---- if (!loop.isCounted()) { loopBegin.getDebug().log(DebugContext.VERBOSE_LEVEL, "shouldPartiallyUnroll %s isn't counted", loopBegin); return false; } OptionValues options = loop.entryPoint().getOptions(); ! int maxNodes = Options.ExactPartialUnrollMaxNodes.getValue(options); maxNodes = Math.min(maxNodes, Math.max(0, MaximumDesiredSize.getValue(options) - loop.loopBegin().graph().getNodeCount())); int size = Math.max(1, loop.size() - 1 - loop.loopBegin().phis().count()); int unrollFactor = loopBegin.getUnrollFactor(); if (unrollFactor == 1) { double loopFrequency = loopBegin.loopFrequency();
*** 116,126 **** loopBegin.getDebug().log(DebugContext.VERBOSE_LEVEL, "shouldPartiallyUnroll %s frequency too low %s ", loopBegin, loopFrequency); return false; } loopBegin.setLoopOrigFrequency(loopFrequency); } ! int maxUnroll = UnrollMaxIterations.getValue(options); // Now correct size for the next unroll. UnrollMaxIterations == 1 means perform the // pre/main/post transformation but don't actually unroll the main loop. size += size; if (maxUnroll == 1 && loopBegin.isSimpleLoop() || size <= maxNodes && unrollFactor < maxUnroll) { // Will the next unroll fit? --- 119,129 ---- loopBegin.getDebug().log(DebugContext.VERBOSE_LEVEL, "shouldPartiallyUnroll %s frequency too low %s ", loopBegin, loopFrequency); return false; } loopBegin.setLoopOrigFrequency(loopFrequency); } ! int maxUnroll = Options.UnrollMaxIterations.getValue(options); // Now correct size for the next unroll. UnrollMaxIterations == 1 means perform the // pre/main/post transformation but don't actually unroll the main loop. size += size; if (maxUnroll == 1 && loopBegin.isSimpleLoop() || size <= maxNodes && unrollFactor < maxUnroll) { // Will the next unroll fit?
*** 188,200 **** int inBranchTotal = branchNodes.count(); CountingClosure stateNodesCount = new CountingClosure(); double loopFrequency = loop.loopBegin().loopFrequency(); OptionValues options = loop.loopBegin().getOptions(); ! int maxDiff = LoopUnswitchTrivial.getValue(options) + (int) (LoopUnswitchFrequencyBoost.getValue(options) * (loopFrequency - 1.0 + phis)); ! maxDiff = Math.min(maxDiff, LoopUnswitchMaxIncrease.getValue(options)); int remainingGraphSpace = MaximumDesiredSize.getValue(options) - graph.getNodeCount(); maxDiff = Math.min(maxDiff, remainingGraphSpace); loop.loopBegin().stateAfter().applyToVirtual(stateNodesCount); int loopTotal = loop.size() - loop.loopBegin().phis().count() - stateNodesCount.count - 1; --- 191,203 ---- int inBranchTotal = branchNodes.count(); CountingClosure stateNodesCount = new CountingClosure(); double loopFrequency = loop.loopBegin().loopFrequency(); OptionValues options = loop.loopBegin().getOptions(); ! int maxDiff = Options.LoopUnswitchTrivial.getValue(options) + (int) (Options.LoopUnswitchFrequencyBoost.getValue(options) * (loopFrequency - 1.0 + phis)); ! maxDiff = Math.min(maxDiff, Options.LoopUnswitchMaxIncrease.getValue(options)); int remainingGraphSpace = MaximumDesiredSize.getValue(options) - graph.getNodeCount(); maxDiff = Math.min(maxDiff, remainingGraphSpace); loop.loopBegin().stateAfter().applyToVirtual(stateNodesCount); int loopTotal = loop.size() - loop.loopBegin().phis().count() - stateNodesCount.count - 1;
< prev index next >