< prev index next >

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

Print this page
rev 52509 : [mq]: graal

*** 22,38 **** */ package org.graalvm.compiler.loop.phases; import org.graalvm.compiler.graph.Graph; import org.graalvm.compiler.loop.LoopEx; import org.graalvm.compiler.loop.LoopPolicies; import org.graalvm.compiler.loop.LoopsData; import org.graalvm.compiler.nodes.StructuredGraph; import org.graalvm.compiler.phases.common.CanonicalizerPhase; ! import org.graalvm.compiler.phases.common.util.HashSetNodeEventListener; import org.graalvm.compiler.phases.tiers.PhaseContext; public class LoopPartialUnrollPhase extends LoopPhase<LoopPolicies> { private final CanonicalizerPhase canonicalizer; --- 22,42 ---- */ package org.graalvm.compiler.loop.phases; + import jdk.internal.vm.compiler.collections.EconomicMap; + import jdk.internal.vm.compiler.collections.Equivalence; import org.graalvm.compiler.graph.Graph; import org.graalvm.compiler.loop.LoopEx; import org.graalvm.compiler.loop.LoopPolicies; import org.graalvm.compiler.loop.LoopsData; + import org.graalvm.compiler.nodes.LoopBeginNode; import org.graalvm.compiler.nodes.StructuredGraph; + import org.graalvm.compiler.nodes.extended.OpaqueNode; import org.graalvm.compiler.phases.common.CanonicalizerPhase; ! import org.graalvm.compiler.phases.common.util.EconomicSetNodeEventListener; import org.graalvm.compiler.phases.tiers.PhaseContext; public class LoopPartialUnrollPhase extends LoopPhase<LoopPolicies> { private final CanonicalizerPhase canonicalizer;
*** 44,55 **** @Override @SuppressWarnings("try") protected void run(StructuredGraph graph, PhaseContext context) { if (graph.hasLoops()) { ! HashSetNodeEventListener listener = new HashSetNodeEventListener(); boolean changed = true; while (changed) { changed = false; try (Graph.NodeEventScope nes = graph.trackNodeEvents(listener)) { LoopsData dataCounted = new LoopsData(graph); dataCounted.detectedCountedLoops(); --- 48,60 ---- @Override @SuppressWarnings("try") protected void run(StructuredGraph graph, PhaseContext context) { if (graph.hasLoops()) { ! EconomicSetNodeEventListener listener = new EconomicSetNodeEventListener(); boolean changed = true; + EconomicMap<LoopBeginNode, OpaqueNode> opaqueUnrolledStrides = null; while (changed) { changed = false; try (Graph.NodeEventScope nes = graph.trackNodeEvents(listener)) { LoopsData dataCounted = new LoopsData(graph); dataCounted.detectedCountedLoops();
*** 64,74 **** // First perform the pre/post transformation and do the partial // unroll when we come around again. LoopTransformations.insertPrePostLoops(loop); prePostInserted = true; } else { ! LoopTransformations.partialUnroll(loop); } changed = true; } } dataCounted.deleteUnusedNodes(); --- 69,82 ---- // First perform the pre/post transformation and do the partial // unroll when we come around again. LoopTransformations.insertPrePostLoops(loop); prePostInserted = true; } else { ! if (opaqueUnrolledStrides == null) { ! opaqueUnrolledStrides = EconomicMap.create(Equivalence.IDENTITY); ! } ! LoopTransformations.partialUnroll(loop, opaqueUnrolledStrides); } changed = true; } } dataCounted.deleteUnusedNodes();
*** 79,88 **** --- 87,106 ---- } assert !prePostInserted || checkCounted(graph, mark); } } + if (opaqueUnrolledStrides != null) { + try (Graph.NodeEventScope nes = graph.trackNodeEvents(listener)) { + for (OpaqueNode opaque : opaqueUnrolledStrides.getValues()) { + opaque.remove(); + } + if (!listener.getNodes().isEmpty()) { + canonicalizer.applyIncremental(graph, context, listener.getNodes()); + } + } + } } } private static boolean checkCounted(StructuredGraph graph, Graph.Mark mark) { LoopsData dataCounted;
< prev index next >