changeset 13693:4efb3399a36e

additional simplifications for IfNode and MergeNode
author Lukas Stadler <lukas.stadler@jku.at>
date Fri, 17 Jan 2014 09:38:39 +0100
parents c215dec9d3cf
children 0e8c22aa6ec3
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MergeNode.java
diffstat 2 files changed, 54 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Wed Jan 15 16:11:56 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Fri Jan 17 09:38:39 2014 +0100
@@ -371,6 +371,29 @@
                 }
             }
         }
+        if (trueSuccessor().next() instanceof ReturnNode && falseSuccessor().next() instanceof ReturnNode) {
+            ReturnNode trueEnd = (ReturnNode) trueSuccessor().next();
+            ReturnNode falseEnd = (ReturnNode) falseSuccessor().next();
+            ValueNode trueValue = trueEnd.result();
+            ValueNode falseValue = falseEnd.result();
+            ConditionalNode conditional = null;
+            if (trueValue != null) {
+                if (trueValue.kind() != falseValue.kind()) {
+                    return false;
+                }
+                if (trueValue.kind() != Kind.Int && trueValue.kind() != Kind.Long) {
+                    return false;
+                }
+                conditional = canonicalizeConditionalCascade(trueValue, falseValue);
+                if (conditional == null) {
+                    return false;
+                }
+            }
+            ReturnNode newReturn = graph().add(new ReturnNode(conditional));
+            replaceAtPredecessor(newReturn);
+            GraphUtil.killCFG(this);
+            return true;
+        }
         return false;
     }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MergeNode.java	Wed Jan 15 16:11:56 2014 +0100
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/MergeNode.java	Fri Jan 17 09:38:39 2014 +0100
@@ -24,6 +24,8 @@
 
 import static com.oracle.graal.graph.iterators.NodePredicates.*;
 
+import java.util.*;
+
 import com.oracle.graal.debug.*;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.graph.iterators.*;
@@ -194,6 +196,35 @@
                 tool.addToWorkList(newEnd.predecessor()); // ?
             }
             graph().reduceTrivialMerge(this);
+        } else if (next instanceof ReturnNode) {
+            ReturnNode returnNode = (ReturnNode) next;
+            if (anchored().isNotEmpty() || returnNode.getMemoryMap() != null) {
+                return;
+            }
+            List<PhiNode> phis = phis().snapshot();
+            for (PhiNode phi : phis) {
+                for (Node usage : phi.usages().filter(isNotA(FrameState.class))) {
+                    if (usage != returnNode) {
+                        return;
+                    }
+                }
+            }
+
+            PhiNode returnValuePhi = returnNode.result() == null || !isPhiAtMerge(returnNode.result()) ? null : (PhiNode) returnNode.result();
+            List<AbstractEndNode> endNodes = forwardEnds().snapshot();
+            for (AbstractEndNode end : endNodes) {
+                ReturnNode newReturn = graph().add(new ReturnNode(returnValuePhi == null ? returnNode.result() : returnValuePhi.valueAt(end)));
+                end.replaceAtPredecessor(newReturn);
+            }
+            GraphUtil.killCFG(this);
+            for (AbstractEndNode end : endNodes) {
+                end.safeDelete();
+            }
+            for (PhiNode phi : phis) {
+                if (phi.isAlive() && phi.usages().isEmpty()) {
+                    GraphUtil.killWithUnusedFloatingInputs(phi);
+                }
+            }
         }
     }
 }