changeset 14995:4976f469670e

remove unnecessary proxies during loop peeling
author Lukas Stadler <lukas.stadler@oracle.com>
date Mon, 07 Apr 2014 10:35:16 +0200
parents 610784692a5e
children 88d77743dff3
files graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragment.java
diffstat 1 files changed, 13 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragment.java	Sun Apr 06 19:31:59 2014 +0200
+++ b/graal/com.oracle.graal.loop/src/com/oracle/graal/loop/LoopFragment.java	Mon Apr 07 10:35:16 2014 +0200
@@ -31,6 +31,7 @@
 import com.oracle.graal.nodes.VirtualState.VirtualClosure;
 import com.oracle.graal.nodes.cfg.*;
 import com.oracle.graal.nodes.java.*;
+import com.oracle.graal.nodes.util.*;
 import com.oracle.graal.nodes.virtual.*;
 
 public abstract class LoopFragment {
@@ -285,6 +286,7 @@
             if (newEarlyExit == null) {
                 continue;
             }
+            boolean newEarlyExitIsBegin = newEarlyExit instanceof BeginNode;
             MergeNode merge = graph.add(new MergeNode());
             AbstractEndNode originalEnd = graph.add(new EndNode());
             AbstractEndNode newEnd = graph.add(new EndNode());
@@ -340,7 +342,7 @@
                         throw GraalInternalError.shouldNotReachHere();
                     }
                     phi.addInput(vpn);
-                    phi.addInput(newVpn);
+                    phi.addInput(newEarlyExitIsBegin ? newVpn.value() : newVpn);
                     replaceWith = phi;
                 } else {
                     replaceWith = vpn.value();
@@ -357,6 +359,16 @@
                     }
                 }
             }
+            if (newEarlyExitIsBegin) {
+                FrameState stateAtNewEarlyExit = newEarlyExit.stateAfter();
+                if (stateAtNewEarlyExit != null) {
+                    newEarlyExit.setStateAfter(null);
+                    GraphUtil.killWithUnusedFloatingInputs(stateAtNewEarlyExit);
+                }
+                for (ProxyNode proxy : newEarlyExit.proxies().snapshot()) {
+                    GraphUtil.killWithUnusedFloatingInputs(proxy);
+                }
+            }
         }
     }
 }