changeset 23168:2ad910b35d66

Add simplification to LoopExitNode to make sure counted loops are correctly recognized.
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Sun, 13 Dec 2015 16:17:29 +0100
parents e1dcae68639a
children db2df49e2245
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopExitNode.java
diffstat 1 files changed, 14 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopExitNode.java	Sun Dec 13 15:58:04 2015 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LoopExitNode.java	Sun Dec 13 16:17:29 2015 +0100
@@ -23,12 +23,15 @@
 package com.oracle.graal.nodes;
 
 import com.oracle.graal.graph.IterableNodeType;
+import com.oracle.graal.graph.Node;
 import com.oracle.graal.graph.NodeClass;
+import com.oracle.graal.graph.spi.Simplifiable;
+import com.oracle.graal.graph.spi.SimplifierTool;
 import com.oracle.graal.nodeinfo.InputType;
 import com.oracle.graal.nodeinfo.NodeInfo;
 
 @NodeInfo(allowedUsageTypes = {InputType.Association})
-public final class LoopExitNode extends BeginStateSplitNode implements IterableNodeType {
+public final class LoopExitNode extends BeginStateSplitNode implements IterableNodeType, Simplifiable {
 
     public static final NodeClass<LoopExitNode> TYPE = NodeClass.create(LoopExitNode.class);
     @Input(InputType.Association) LoopBeginNode loopBegin;
@@ -42,4 +45,14 @@
     public LoopBeginNode loopBegin() {
         return loopBegin;
     }
+
+    @Override
+    public void simplify(SimplifierTool tool) {
+        Node prev = this.predecessor();
+        while (tool.allUsagesAvailable() && prev instanceof BeginNode && prev.hasNoUsages()) {
+            AbstractBeginNode begin = (AbstractBeginNode) prev;
+            prev = prev.predecessor();
+            graph().removeFixed(begin);
+        }
+    }
 }