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