# HG changeset patch # User Gilles Duboscq # Date 1404231968 -7200 # Node ID 3e341c30e5c04bd89c480cdb99fec175637c813b # Parent 6055f84e41d74f4b638af5a0d152894600a546aa No need to duplicate the loop begin's state for LoopFragmentInside diff -r 6055f84e41d7 -r 3e341c30e5c0 graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragmentInside.java --- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragmentInside.java Tue Jul 01 18:10:27 2014 +0200 +++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragmentInside.java Tue Jul 01 18:26:08 2014 +0200 @@ -113,15 +113,9 @@ for (PhiNode phi : loopBegin.phis()) { nodes.clear(phi); } + clearStateNodes(loopBegin); for (LoopExitNode exit : exits()) { - FrameState exitState = exit.stateAfter(); - if (exitState != null) { - exitState.applyToVirtual(v -> { - if (v.usages().filter(n -> nodes.isMarked(n) && n != exit).isEmpty()) { - nodes.clear(v); - } - }); - } + clearStateNodes(exit); for (ProxyNode proxy : exit.proxies()) { nodes.clear(proxy); } @@ -130,6 +124,17 @@ return nodes; } + private void clearStateNodes(StateSplit stateSplit) { + FrameState loopState = stateSplit.stateAfter(); + if (loopState != null) { + loopState.applyToVirtual(v -> { + if (v.usages().filter(n -> nodes.isMarked(n) && n != stateSplit).isEmpty()) { + nodes.clear(v); + } + }); + } + } + public NodeIterable exits() { return loop().loopBegin().loopExits(); } @@ -202,14 +207,12 @@ NodeBitMap usagesToPatch = nodes.copy(); for (LoopExitNode exit : exits()) { - FrameState exitState = exit.stateAfter(); - if (exitState != null) { - exitState.applyToVirtual(v -> usagesToPatch.markAndGrow(v)); - } + markStateNodes(exit, usagesToPatch); for (ProxyNode proxy : exit.proxies()) { usagesToPatch.markAndGrow(proxy); } } + markStateNodes(loopBegin, usagesToPatch); for (PhiNode phi : loopBegin.phis().snapshot()) { if (phi.usages().isEmpty()) { @@ -259,6 +262,13 @@ } } + private static void markStateNodes(StateSplit stateSplit, NodeBitMap marks) { + FrameState exitState = stateSplit.stateAfter(); + if (exitState != null) { + exitState.applyToVirtual(v -> marks.markAndGrow(v)); + } + } + /** * Gets the corresponding value in this fragment. *