# HG changeset patch # User Lukas Stadler # Date 1383241531 -3600 # Node ID 04c74433529a7f5c4caea44d536aeaf3e4dff809 # Parent f376a77c22fbc50209ec7bd0df82ce387fb033f2 PEA: create ProxyNodes when the LoopExitNode is encountered, not between blocks diff -r f376a77c22fb -r 04c74433529a graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java --- a/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java Thu Oct 31 18:44:47 2013 +0100 +++ b/graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java Thu Oct 31 18:45:31 2013 +0100 @@ -44,6 +44,7 @@ protected final NodeMap aliases; protected final BlockMap blockEffects; private final IdentityHashMap loopMergeEffects = new IdentityHashMap<>(); + private final IdentityHashMap loopEntryStates = new IdentityHashMap<>(); private boolean changed; @@ -122,6 +123,10 @@ FixedWithNextNode lastFixedNode = null; for (Node node : schedule.getBlockToNodesMap().get(block)) { aliases.set(node, null); + if (node instanceof LoopExitNode) { + LoopExitNode loopExit = (LoopExitNode) node; + processLoopExit(loopExit, loopEntryStates.get(loopExit.loopBegin()), state, blockEffects.get(block)); + } changed |= processNode(node, state, effects, lastFixedNode); if (node instanceof FixedWithNextNode) { lastFixedNode = (FixedWithNextNode) node; @@ -169,10 +174,9 @@ loopMergeEffects.put(loop, mergeProcessor.afterMergeEffects); assert info.exitStates.size() == loop.exits.size(); + loopEntryStates.put(loop.loopBegin(), loopEntryState); for (int i = 0; i < loop.exits.size(); i++) { - BlockT exitState = info.exitStates.get(i); - assert exitState != null : "no loop exit state at " + loop.exits.get(i) + " / " + loop.header; - processLoopExit((LoopExitNode) loop.exits.get(i).getBeginNode(), loopEntryState, exitState, blockEffects.get(loop.exits.get(i))); + assert info.exitStates.get(i) != null : "no loop exit state at " + loop.exits.get(i) + " / " + loop.header; } return info.exitStates;