Mercurial > hg > truffle
changeset 19774:5e74068c9150
iterative marking of loop phis in SchedulePhase
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Wed, 11 Mar 2015 16:35:26 +0100 |
parents | e66a6f8d63e3 |
children | 905afef74a2e |
files | graal/com.oracle.graal.phases/src/com/oracle/graal/phases/schedule/SchedulePhase.java |
diffstat | 1 files changed, 24 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- 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()) {