# HG changeset patch # User Doug Simon # Date 1386169401 -3600 # Node ID 0909754d87f4c3464d11c9dd6fe8584efe4d0890 # Parent af7d328b2cc72ae7f9dad3d8f13169e768533985 tightened assertion about lowering a floating node with unscheduled usages to cases where it really matters diff -r af7d328b2cc7 -r 0909754d87f4 graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/LoweringPhase.java --- a/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/LoweringPhase.java Wed Dec 04 16:01:30 2013 +0100 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/LoweringPhase.java Wed Dec 04 16:03:21 2013 +0100 @@ -192,12 +192,22 @@ * * @param node a node that was just lowered * @param preLoweringMark the graph mark before {@code node} was lowered + * @param unscheduledUsages set of {@code node}'s usages that were unscheduled before it was + * lowered * @throws AssertionError if the check fails */ - private static boolean checkPostNodeLowering(Node node, LoweringToolImpl loweringTool, Mark preLoweringMark) { + private static boolean checkPostNodeLowering(Node node, LoweringToolImpl loweringTool, Mark preLoweringMark, Collection unscheduledUsages) { StructuredGraph graph = (StructuredGraph) node.graph(); Mark postLoweringMark = graph.getMark(); NodeIterable newNodesAfterLowering = graph.getNewNodes(preLoweringMark); + if (node instanceof FloatingNode) { + if (!unscheduledUsages.isEmpty()) { + for (Node n : newNodesAfterLowering) { + assert !(n instanceof FixedNode) : node.graph() + ": cannot lower floatable node " + node + " as it introduces fixed node(s) but has the following unscheduled usages: " + + unscheduledUsages; + } + } + } for (Node n : newNodesAfterLowering) { if (n instanceof Lowerable) { ((Lowerable) n).lower(loweringTool); @@ -280,13 +290,14 @@ } if (node instanceof Lowerable) { - assert checkUsagesAreScheduled(node); + Collection unscheduledUsages = null; + assert (unscheduledUsages = getUnscheduledUsages(node)) != null; Mark preLoweringMark = node.graph().getMark(); ((Lowerable) node).lower(loweringTool); if (node == startAnchor && node.isDeleted()) { loweringTool.guardAnchor = BeginNode.prevBegin(nextNode); } - assert checkPostNodeLowering(node, loweringTool, preLoweringMark); + assert checkPostNodeLowering(node, loweringTool, preLoweringMark, unscheduledUsages); } if (!nextNode.isAlive()) { @@ -313,7 +324,7 @@ } /** - * Checks that all usages of a floating, lowerable node are scheduled. + * Gets all usages of a floating, lowerable node that are unscheduled. *

* Given that the lowering of such nodes may introduce fixed nodes, they must be lowered in * the context of a usage that dominates all other usages. The fixed nodes resulting from @@ -322,16 +333,19 @@ * * @param node a {@link Lowerable} node */ - private boolean checkUsagesAreScheduled(Node node) { + private Collection getUnscheduledUsages(Node node) { + List unscheduledUsages = new ArrayList<>(); if (node instanceof FloatingNode) { for (Node usage : node.usages()) { if (usage instanceof ScheduledNode) { Block usageBlock = schedule.getCFG().blockFor(usage); - assert usageBlock != null : node.graph() + ": cannot lower floatable node " + node + " that has non-scheduled usage " + usage; + if (usageBlock == null) { + unscheduledUsages.add(usage); + } } } } - return true; + return unscheduledUsages; } } }