Mercurial > hg > graal-compiler
changeset 16351:3e341c30e5c0
No need to duplicate the loop begin's state for LoopFragmentInside
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Tue, 01 Jul 2014 18:26:08 +0200 |
parents | 6055f84e41d7 |
children | 00460aab5c96 |
files | graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragmentInside.java |
diffstat | 1 files changed, 22 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- 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<LoopExitNode> 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. *