# HG changeset patch # User Lukas Stadler # Date 1426088126 -3600 # Node ID 5e74068c9150aa3ac98aece320ae6033f0c95e79 # Parent e66a6f8d63e32358fac6c5c80c8e78913fd322a5 iterative marking of loop phis in SchedulePhase diff -r e66a6f8d63e3 -r 5e74068c9150 graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Wed Mar 11 15:44:32 2015 +0100 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java Wed Mar 11 16:35:26 2015 +0100 @@ -377,19 +377,34 @@ processStack(blockToNodes, nodeToBlock, visited, stack); // Visit back input edges of loop phis. - for (LoopBeginNode loopBegin : graph.getNodes(LoopBeginNode.TYPE)) { - for (PhiNode phi : loopBegin.phis()) { - if (visited.isMarked(phi)) { - for (int i = 0; i < loopBegin.getLoopEndCount(); ++i) { - Node node = phi.valueAt(i + loopBegin.forwardEndCount()); - if (node != null && !visited.isMarked(node)) { - stack.push(node); - processStack(blockToNodes, nodeToBlock, visited, stack); + + boolean changed; + boolean unmarkedPhi; + do { + changed = false; + unmarkedPhi = false; + for (LoopBeginNode loopBegin : graph.getNodes(LoopBeginNode.TYPE)) { + for (PhiNode phi : loopBegin.phis()) { + if (visited.isMarked(phi)) { + for (int i = 0; i < loopBegin.getLoopEndCount(); ++i) { + Node node = phi.valueAt(i + loopBegin.forwardEndCount()); + if (node != null && !visited.isMarked(node)) { + changed = true; + stack.push(node); + processStack(blockToNodes, nodeToBlock, visited, stack); + } } + } else { + unmarkedPhi = true; } } } - } + + /* + * the processing of one loop phi could have marked a previously checked loop phi, + * therefore this needs to be iterative. + */ + } while (unmarkedPhi && changed); // Check for dead nodes. if (visited.getCounter() < graph.getNodeCount()) {