< 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




  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 }
< prev index next >