changeset 8403:a007cbe2be30

Add asFixedNode to FloatingAccessNode so that GuardLoweringPhase supports any type of FloatingAccessNode Relax an assert in GuardLoweringPhase to only check for FixedNode instead of AccessNode
author Gilles Duboscq <duboscq@ssw.jku.at>
date Wed, 20 Mar 2013 16:27:07 +0100
parents c0db24536e97
children 24ddd568aa0c
files graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingAccessNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java
diffstat 3 files changed, 19 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingAccessNode.java	Wed Mar 20 08:22:35 2013 -0700
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingAccessNode.java	Wed Mar 20 16:27:07 2013 +0100
@@ -77,4 +77,6 @@
     public Node node() {
         return this;
     }
+
+    public abstract Access asFixedNode();
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java	Wed Mar 20 08:22:35 2013 -0700
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java	Wed Mar 20 16:27:07 2013 +0100
@@ -60,4 +60,9 @@
     public ValueNode canonical(CanonicalizerTool tool) {
         return ReadNode.canonicalizeRead(this, location(), object(), tool);
     }
+
+    @Override
+    public Access asFixedNode() {
+        return graph().add(new ReadNode(object(), nullCheckLocation(), stamp(), dependencies()));
+    }
 }
--- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java	Wed Mar 20 08:22:35 2013 -0700
+++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java	Wed Mar 20 16:27:07 2013 +0100
@@ -56,7 +56,7 @@
     private static void processBlock(Block block, SchedulePhase schedule, StructuredGraph graph, TargetDescription target) {
         List<ScheduledNode> nodes = schedule.nodesFor(block);
         if (GraalOptions.OptImplicitNullChecks && target.implicitNullCheckLimit > 0) {
-            useImplicitNullChecks(block.getBeginNode(), nodes, graph, target);
+            useImplicitNullChecks(block.getBeginNode(), nodes, target);
         }
         FixedWithNextNode lastFixed = block.getBeginNode();
         FixedWithNextNode lastFastPath = null;
@@ -108,7 +108,7 @@
         }
     }
 
-    private static void useImplicitNullChecks(BeginNode begin, List<ScheduledNode> nodes, StructuredGraph graph, TargetDescription target) {
+    private static void useImplicitNullChecks(BeginNode begin, List<ScheduledNode> nodes, TargetDescription target) {
         ListIterator<ScheduledNode> iterator = nodes.listIterator();
         IdentityHashMap<ValueNode, GuardNode> nullGuarded = new IdentityHashMap<>();
         FixedWithNextNode lastFixed = begin;
@@ -136,16 +136,17 @@
                 if (guard != null && isImplicitNullCheck(access.nullCheckLocation(), target)) {
                     NodeInputList<ValueNode> dependencies = ((ValueNode) access).dependencies();
                     dependencies.remove(guard);
-                    if (access instanceof FloatingReadNode) {
-                        ReadNode read = graph.add(new ReadNode(access.object(), access.nullCheckLocation(), ((FloatingReadNode) access).stamp(), dependencies));
-                        node.replaceAndDelete(read);
-                        access = read;
-                        lastFixed.setNext(read);
-                        lastFixed = read;
-                        reconnect = read;
-                        iterator.set(read);
+                    if (access instanceof FloatingAccessNode) {
+                        Access fixedRead = ((FloatingAccessNode) access).asFixedNode();
+                        node.replaceAndDelete(fixedRead.node());
+                        access = fixedRead;
+                        FixedWithNextNode fixedAccess = (FixedWithNextNode) fixedRead.node();
+                        lastFixed.setNext(fixedAccess);
+                        lastFixed = fixedAccess;
+                        reconnect = fixedAccess;
+                        iterator.set(fixedAccess);
                     }
-                    assert access instanceof AccessNode;
+                    assert access instanceof FixedNode;
                     access.setNullCheck(true);
                     LogicNode condition = guard.condition();
                     guard.replaceAndDelete(access.node());