hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopPartialUnrollPhase.java
--- a/hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopPartialUnrollPhase.java Sat Aug 05 03:05:06 2017 +0200
+++ b/hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/LoopPartialUnrollPhase.java Fri Aug 04 19:59:33 2017 -0700
@@ -45,12 +45,12 @@
protected void run(StructuredGraph graph, PhaseContext context) {
if (graph.hasLoops()) {
HashSetNodeEventListener listener = new HashSetNodeEventListener();
- try (Graph.NodeEventScope nes = graph.trackNodeEvents(listener)) {
- boolean changed = true;
- while (changed) {
+ boolean changed = true;
+ while (changed) {
+ changed = false;
+ try (Graph.NodeEventScope nes = graph.trackNodeEvents(listener)) {
LoopsData dataCounted = new LoopsData(graph);
dataCounted.detectedCountedLoops();
- changed = false;
for (LoopEx loop : dataCounted.countedLoops()) {
if (!LoopTransformations.isUnrollableLoop(loop)) {
continue;
@@ -60,19 +60,20 @@
// First perform the pre/post transformation and do the partial
// unroll when we come around again.
LoopTransformations.insertPrePostLoops(loop, graph);
- changed = true;
} else {
- changed |= LoopTransformations.partialUnroll(loop, graph);
+ LoopTransformations.partialUnroll(loop, graph);
}
+ changed = true;
}
}
dataCounted.deleteUnusedNodes();
+
+ if (!listener.getNodes().isEmpty()) {
+ canonicalizer.applyIncremental(graph, context, listener.getNodes());
+ listener.getNodes().clear();
+ }
}
}
- if (!listener.getNodes().isEmpty()) {
- canonicalizer.applyIncremental(graph, context, listener.getNodes());
- listener.getNodes().clear();
- }
}
}