# HG changeset patch # User Gilles Duboscq # Date 1363793227 -3600 # Node ID a007cbe2be305b3d2a40e08cd034cb7b9dbf02eb # Parent c0db24536e9784ffea6fa8b2c20f1b1f93d978b2 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 diff -r c0db24536e97 -r a007cbe2be30 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingAccessNode.java --- 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(); } diff -r c0db24536e97 -r a007cbe2be30 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/FloatingReadNode.java --- 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())); + } } diff -r c0db24536e97 -r a007cbe2be30 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java --- 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 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 nodes, StructuredGraph graph, TargetDescription target) { + private static void useImplicitNullChecks(BeginNode begin, List nodes, TargetDescription target) { ListIterator iterator = nodes.listIterator(); IdentityHashMap nullGuarded = new IdentityHashMap<>(); FixedWithNextNode lastFixed = begin; @@ -136,16 +136,17 @@ if (guard != null && isImplicitNullCheck(access.nullCheckLocation(), target)) { NodeInputList 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());