< 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]: graal2

@@ -22,17 +22,21 @@
  */
 
 
 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.HashSetNodeEventListener;
+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,12 +48,13 @@
 
     @Override
     @SuppressWarnings("try")
     protected void run(StructuredGraph graph, PhaseContext context) {
         if (graph.hasLoops()) {
-            HashSetNodeEventListener listener = new HashSetNodeEventListener();
+            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,11 +69,14 @@
                                 // 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);
+                                if (opaqueUnrolledStrides == null) {
+                                    opaqueUnrolledStrides = EconomicMap.create(Equivalence.IDENTITY);
+                                }
+                                LoopTransformations.partialUnroll(loop, opaqueUnrolledStrides);
                             }
                             changed = true;
                         }
                     }
                     dataCounted.deleteUnusedNodes();

@@ -79,10 +87,20 @@
                     }
 
                     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 >