Mercurial > hg > truffle
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());