< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.loop.phases/src/org/graalvm/compiler/loop/phases/ReassociateInvariantPhase.java

Print this page

        

@@ -24,26 +24,36 @@
 
 import org.graalvm.compiler.debug.DebugContext;
 import org.graalvm.compiler.loop.LoopEx;
 import org.graalvm.compiler.loop.LoopsData;
 import org.graalvm.compiler.nodes.StructuredGraph;
+import org.graalvm.compiler.nodes.calc.BinaryArithmeticNode;
 import org.graalvm.compiler.phases.Phase;
 
+/**
+ * Rearrange {@link BinaryArithmeticNode#isAssociative() associative binary operations} so that
+ * invariant parts of the expression can move outside of the loop.
+ */
 public class ReassociateInvariantPhase extends Phase {
 
     @SuppressWarnings("try")
     @Override
     protected void run(StructuredGraph graph) {
-        if (graph.hasLoops()) {
-            final LoopsData dataReassociate = new LoopsData(graph);
+        int iterations = 0;
             DebugContext debug = graph.getDebug();
             try (DebugContext.Scope s = debug.scope("ReassociateInvariants")) {
+            boolean changed = true;
+            while (changed) {
+                changed = false;
+                final LoopsData dataReassociate = new LoopsData(graph);
                 for (LoopEx loop : dataReassociate.loops()) {
-                    loop.reassociateInvariants();
+                    changed |= loop.reassociateInvariants();
+                }
+                dataReassociate.deleteUnusedNodes();
+                iterations++;
+                debug.dump(DebugContext.VERBOSE_LEVEL, graph, "after iteration %d", iterations);
                 }
             } catch (Throwable e) {
                 throw debug.handle(e);
             }
-            dataReassociate.deleteUnusedNodes();
-        }
     }
 }
< prev index next >