28 import org.graalvm.compiler.loop.LoopsData; 29 import org.graalvm.compiler.nodes.StructuredGraph; 30 import org.graalvm.compiler.phases.common.CanonicalizerPhase; 31 import org.graalvm.compiler.phases.common.util.HashSetNodeEventListener; 32 import org.graalvm.compiler.phases.tiers.PhaseContext; 33 34 public class LoopPartialUnrollPhase extends LoopPhase<LoopPolicies> { 35 36 private final CanonicalizerPhase canonicalizer; 37 38 public LoopPartialUnrollPhase(LoopPolicies policies, CanonicalizerPhase canonicalizer) { 39 super(policies); 40 this.canonicalizer = canonicalizer; 41 } 42 43 @Override 44 @SuppressWarnings("try") 45 protected void run(StructuredGraph graph, PhaseContext context) { 46 if (graph.hasLoops()) { 47 HashSetNodeEventListener listener = new HashSetNodeEventListener(); 48 try (Graph.NodeEventScope nes = graph.trackNodeEvents(listener)) { 49 boolean changed = true; 50 while (changed) { 51 LoopsData dataCounted = new LoopsData(graph); 52 dataCounted.detectedCountedLoops(); 53 changed = false; 54 for (LoopEx loop : dataCounted.countedLoops()) { 55 if (!LoopTransformations.isUnrollableLoop(loop)) { 56 continue; 57 } 58 if (getPolicies().shouldPartiallyUnroll(loop)) { 59 if (loop.loopBegin().isSimpleLoop()) { 60 // First perform the pre/post transformation and do the partial 61 // unroll when we come around again. 62 LoopTransformations.insertPrePostLoops(loop, graph); 63 changed = true; 64 } else { 65 changed |= LoopTransformations.partialUnroll(loop, graph); 66 } 67 } 68 } 69 dataCounted.deleteUnusedNodes(); 70 } 71 } 72 if (!listener.getNodes().isEmpty()) { 73 canonicalizer.applyIncremental(graph, context, listener.getNodes()); 74 listener.getNodes().clear(); 75 } 76 } 77 } 78 79 @Override 80 public boolean checkContract() { 81 return false; 82 } 83 } | 28 import org.graalvm.compiler.loop.LoopsData; 29 import org.graalvm.compiler.nodes.StructuredGraph; 30 import org.graalvm.compiler.phases.common.CanonicalizerPhase; 31 import org.graalvm.compiler.phases.common.util.HashSetNodeEventListener; 32 import org.graalvm.compiler.phases.tiers.PhaseContext; 33 34 public class LoopPartialUnrollPhase extends LoopPhase<LoopPolicies> { 35 36 private final CanonicalizerPhase canonicalizer; 37 38 public LoopPartialUnrollPhase(LoopPolicies policies, CanonicalizerPhase canonicalizer) { 39 super(policies); 40 this.canonicalizer = canonicalizer; 41 } 42 43 @Override 44 @SuppressWarnings("try") 45 protected void run(StructuredGraph graph, PhaseContext context) { 46 if (graph.hasLoops()) { 47 HashSetNodeEventListener listener = new HashSetNodeEventListener(); 48 boolean changed = true; 49 while (changed) { 50 changed = false; 51 try (Graph.NodeEventScope nes = graph.trackNodeEvents(listener)) { 52 LoopsData dataCounted = new LoopsData(graph); 53 dataCounted.detectedCountedLoops(); 54 for (LoopEx loop : dataCounted.countedLoops()) { 55 if (!LoopTransformations.isUnrollableLoop(loop)) { 56 continue; 57 } 58 if (getPolicies().shouldPartiallyUnroll(loop)) { 59 if (loop.loopBegin().isSimpleLoop()) { 60 // First perform the pre/post transformation and do the partial 61 // unroll when we come around again. 62 LoopTransformations.insertPrePostLoops(loop, graph); 63 } else { 64 LoopTransformations.partialUnroll(loop, graph); 65 } 66 changed = true; 67 } 68 } 69 dataCounted.deleteUnusedNodes(); 70 71 if (!listener.getNodes().isEmpty()) { 72 canonicalizer.applyIncremental(graph, context, listener.getNodes()); 73 listener.getNodes().clear(); 74 } 75 } 76 } 77 } 78 } 79 80 @Override 81 public boolean checkContract() { 82 return false; 83 } 84 } |