# HG changeset patch # User Gilles Duboscq # Date 1405422740 -7200 # Node ID 7792116a4c3b81ef01e0f5335ab809ffeaaadc8a # Parent ca2b422e8f50b3486487dd9f8a6dad0ba367ea6e Make sure loop unswitching handles guards properly diff -r ca2b422e8f50 -r 7792116a4c3b graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopTransformations.java --- 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) }