# HG changeset patch # User Gilles Duboscq # Date 1379429006 -7200 # Node ID 100e196f87285776b3ad1d97ec4543403b4ca475 # Parent cb81a0f3407cd6526e7ec653b435c3d783531621 ScheduledNodeIterator needs to be able to reconnect even if something is inserted after the last fixed node of a block when there is only one successor diff -r cb81a0f3407c -r 100e196f8728 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 Thu Sep 19 05:00:12 2013 +0200 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/GuardLoweringPhase.java Tue Sep 17 16:43:26 2013 +0200 @@ -193,10 +193,9 @@ } private static void processBlock(Block block, SchedulePhase schedule, int implicitNullCheckLimit) { - List nodes = schedule.nodesFor(block); if (OptImplicitNullChecks.getValue() && implicitNullCheckLimit > 0) { - new UseImplicitNullChecks(implicitNullCheckLimit).processNodes(nodes, block.getBeginNode()); + new UseImplicitNullChecks(implicitNullCheckLimit).processNodes(block, schedule); } - new LowerGuards(block).processNodes(nodes, block.getBeginNode()); + new LowerGuards(block).processNodes(block, schedule); } } diff -r cb81a0f3407c -r 100e196f8728 graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ScheduledNodeIterator.java --- a/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ScheduledNodeIterator.java Thu Sep 19 05:00:12 2013 +0200 +++ b/graal/com.oracle.graal.phases/src/com/oracle/graal/phases/graph/ScheduledNodeIterator.java Tue Sep 17 16:43:26 2013 +0200 @@ -26,6 +26,7 @@ import com.oracle.graal.graph.*; import com.oracle.graal.nodes.*; +import com.oracle.graal.nodes.cfg.*; import com.oracle.graal.phases.schedule.*; /** @@ -41,11 +42,12 @@ private FixedWithNextNode reconnect; private ListIterator iterator; - public void processNodes(List nodes, FixedWithNextNode begin) { - assert begin != null; - lastFixed = begin; + public void processNodes(Block block, SchedulePhase shedule) { + lastFixed = block.getBeginNode(); + assert lastFixed != null; reconnect = null; - iterator = nodes.listIterator(); + iterator = shedule.nodesFor(block).listIterator(); + while (iterator.hasNext()) { Node node = iterator.next(); if (!node.isAlive()) { @@ -60,7 +62,10 @@ } processNode(node); } - assert reconnect == null; + if (reconnect != null) { + assert block.getSuccessorCount() == 1; + reconnect.setNext(block.getFirstSuccessor().getBeginNode()); + } } protected void insert(FixedNode start, FixedWithNextNode end) {