Mercurial > hg > truffle
changeset 16562:7792116a4c3b
Make sure loop unswitching handles guards properly
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Tue, 15 Jul 2014 13:12:20 +0200 |
parents | ca2b422e8f50 |
children | 1e63cb55f61d |
files | graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopTransformations.java |
diffstat | 1 files changed, 10 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopTransformations.java Tue Jul 15 13:13:12 2014 +0200 +++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopTransformations.java Tue Jul 15 13:12:20 2014 +0200 @@ -82,19 +82,25 @@ // original loop is used as first successor Position firstPosition = successors.nextPosition(); NodeClass controlSplitClass = controlSplitNode.getNodeClass(); - controlSplitClass.set(newControlSplit, firstPosition, BeginNode.begin(originalLoop.entryPoint())); + BeginNode originalLoopBegin = BeginNode.begin(originalLoop.entryPoint()); + controlSplitClass.set(newControlSplit, firstPosition, originalLoopBegin); StructuredGraph graph = controlSplitNode.graph(); while (successors.hasNext()) { Position position = successors.nextPosition(); // create a new loop duplicate, connect it and simplify it LoopFragmentWhole duplicateLoop = originalLoop.duplicate(); - controlSplitClass.set(newControlSplit, position, BeginNode.begin(duplicateLoop.entryPoint())); + BeginNode newBegin = BeginNode.begin(duplicateLoop.entryPoint()); + controlSplitClass.set(newControlSplit, position, newBegin); ControlSplitNode duplicatedControlSplit = duplicateLoop.getDuplicatedNode(controlSplitNode); - graph.removeSplitPropagate(duplicatedControlSplit, (BeginNode) controlSplitClass.get(duplicatedControlSplit, position)); + BeginNode survivingSuccessor = (BeginNode) controlSplitClass.get(duplicatedControlSplit, position); + survivingSuccessor.replaceAtUsages(InputType.Guard, newBegin); + graph.removeSplitPropagate(duplicatedControlSplit, survivingSuccessor); } // original loop is simplified last to avoid deleting controlSplitNode too early - graph.removeSplitPropagate(controlSplitNode, (BeginNode) controlSplitClass.get(controlSplitNode, firstPosition)); + BeginNode survivingSuccessor = (BeginNode) controlSplitClass.get(controlSplitNode, firstPosition); + survivingSuccessor.replaceAtUsages(InputType.Guard, originalLoopBegin); + graph.removeSplitPropagate(controlSplitNode, survivingSuccessor); // TODO (gd) probabilities need some amount of fixup.. (probably also in other transforms) }