# HG changeset patch # User Christian Wimmer # Date 1354647901 28800 # Node ID c41a958a39235c0341901d80d64297bcd75a4e8c # Parent 3de18d9cd04e1462d954c11f118b27207727991f Defer lowering to next iteration when the CFG was changed by a previous lowering so that no lastFixedNode is available diff -r 3de18d9cd04e -r c41a958a3923 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 Tue Dec 04 11:02:56 2012 -0800 +++ b/graal/com.oracle.graal.phases.common/src/com/oracle/graal/phases/common/LoweringPhase.java Tue Dec 04 11:05:01 2012 -0800 @@ -104,6 +104,8 @@ private final GraalCodeCacheProvider runtime; private final Assumptions assumptions; + private boolean deferred; + public LoweringPhase(GraalCodeCacheProvider runtime, Assumptions assumptions) { this.runtime = runtime; this.assumptions = assumptions; @@ -127,11 +129,12 @@ final SchedulePhase schedule = new SchedulePhase(); schedule.apply(graph, false); + deferred = false; processBlock(schedule.getCFG().getStartBlock(), graph.createNodeBitMap(), null, schedule, processed); Debug.dump(graph, "Lowering iteration %d", i++); new CanonicalizerPhase(null, runtime, assumptions, mark).apply(graph); - if (!containsLowerable(graph.getNewNodes(mark))) { + if (!deferred && !containsLowerable(graph.getNewNodes(mark))) { // No new lowerable nodes - done! break; } @@ -184,9 +187,14 @@ loweringTool.lastFixedNode = fixed; } - if (node.isAlive() && !processed.isMarked(node)) { - processed.mark(node); - if (node instanceof Lowerable) { + if (node.isAlive() && !processed.isMarked(node) && node instanceof Lowerable) { + if (loweringTool.lastFixedNode == null) { + // We cannot lower the node now because we don't have a fixed node to anchor the replacements. + // This can happen when previous lowerings in this lowering iteration deleted the BeginNode of this block. + // In the next iteration, we will have the new BeginNode available, and we can lower this node. + deferred = true; + } else { + processed.mark(node); ((Lowerable) node).lower(loweringTool); } }