< 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 >