Mercurial > hg > graal-compiler
changeset 12650:04c74433529a
PEA: create ProxyNodes when the LoopExitNode is encountered, not between blocks
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Thu, 31 Oct 2013 18:45:31 +0100 |
parents | f376a77c22fb |
children | c73b857b1be9 |
files | graal/com.oracle.graal.virtual/src/com/oracle/graal/virtual/phases/ea/EffectsClosure.java |
diffstat | 1 files changed, 7 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- 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<ValueNode> aliases; protected final BlockMap<GraphEffectList> blockEffects; private final IdentityHashMap<Loop, GraphEffectList> loopMergeEffects = new IdentityHashMap<>(); + private final IdentityHashMap<LoopBeginNode, BlockT> 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;