changeset 6577:f170a0d2b3b9

disabled IfNode materialization simplification if associated merge has a non-null frame state
author Doug Simon <doug.simon@oracle.com>
date Thu, 25 Oct 2012 12:29:39 +0200
parents a63e3305c0ac
children 1112609bb5dc
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java
diffstat 2 files changed, 5 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginNode.java	Thu Oct 25 08:42:26 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginNode.java	Thu Oct 25 12:29:39 2012 +0200
@@ -102,7 +102,6 @@
     }
 
     public void prepareDelete(FixedNode evacuateFrom) {
-        // TODO (ds) shouldn't non-null framestate be evacutated as well?
         removeProxies();
         evacuateGuards(evacuateFrom);
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Thu Oct 25 08:42:26 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/IfNode.java	Thu Oct 25 12:29:39 2012 +0200
@@ -175,8 +175,6 @@
         return false;
     }
 
-    private static final boolean NON_NULL_FRAMESTATE_EVACUATION_IN_BEGINNODE_SIMPLIFICATION_IMPLEMENTED = false;
-
     /**
      * Tries to connect code that initializes a variable directly with the successors of an if construct
      * that switches on the variable. For example, the pseudo code below:
@@ -235,6 +233,11 @@
             return false;
         }
 
+        if (merge.stateAfter() != null) {
+            // Not sure how (or if) the frame state of the merge can be correctly propagated to the successors
+            return false;
+        }
+
         NodeUsagesList usages = merge.usages();
         if (usages.count() != 1) {
             return false;
@@ -260,19 +263,6 @@
         BeginNode falseSuccessor = falseSuccessor();
         BeginNode trueSuccessor = trueSuccessor();
 
-        if (merge.stateAfter() != null) {
-            if (!NON_NULL_FRAMESTATE_EVACUATION_IN_BEGINNODE_SIMPLIFICATION_IMPLEMENTED) {
-                return false;
-            }
-
-            if (!isFrameStateNullOrEqualTo(falseSuccessor, merge) || !isFrameStateNullOrEqualTo(trueSuccessor, merge)) {
-                // Cannot proceed if the frame state of either successor is different from the merge's frame state
-                return false;
-            }
-            trueSuccessor.setStateAfter(merge.stateAfter());
-            falseSuccessor.setStateAfter(merge.stateAfter());
-        }
-
         setFalseSuccessor(null);
         setTrueSuccessor(null);
 
@@ -295,10 +285,6 @@
         return true;
     }
 
-    protected static boolean isFrameStateNullOrEqualTo(BeginNode successor, MergeNode merge) {
-        return successor.stateAfter() == null || successor.stateAfter() == merge.stateAfter();
-    }
-
     /**
      * Connects a set of ends to a given successor, inserting a merge node if
      * there is more than one end. If {@code ends} is empty, then {@code successor}