# HG changeset patch # User Thomas Wuerthinger # Date 1308229837 -7200 # Node ID d1fd9d15eff3b3b3ed623889c2715e5b143506bb # Parent 775881292ddb99641b611ba516e597e33f691370 Fix regression in graph builder. diff -r 775881292ddb -r d1fd9d15eff3 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/BlockEnd.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/BlockEnd.java Thu Jun 16 15:02:20 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/BlockEnd.java Thu Jun 16 15:10:37 2011 +0200 @@ -87,24 +87,6 @@ } /** - * Substitutes a successor block in this block end's successor list. Note that - * this method updates all occurrences in the list. - * @param oldSucc the old successor to replace - * @param newSucc the new successor - */ - public int substituteSuccessor(Merge oldSucc, Merge newSucc) { - assert newSucc != null; - int count = 0; - for (int i = 0; i < blockSuccessorCount; i++) { - if (blockSuccessor(i) == oldSucc) { - setBlockSuccessor(i, newSucc); - count++; - } - } - return count; - } - - /** * Gets the successor corresponding to the default (fall through) case. * @return the default successor */ diff -r 775881292ddb -r d1fd9d15eff3 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java Thu Jun 16 15:02:20 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java Thu Jun 16 15:10:37 2011 +0200 @@ -297,27 +297,26 @@ assert existingState.stackSize() == newState.stackSize(); if (first instanceof Placeholder) { + Placeholder p = (Placeholder) first; assert !target.isLoopHeader; - Merge merge = new Merge(graph); - Placeholder p = (Placeholder) first; - assert p.predecessors().size() == 1; - assert p.next() == null; - EndNode end = new EndNode(graph); - p.replace(end); - merge.addEnd(end); - target.firstInstruction = merge; - merge.setStateBefore(existingState); - first = merge; + if (p.predecessors().size() == 0) { + p.setStateBefore(newState.duplicate(bci)); + return; + } else { + Merge merge = new Merge(graph); + assert p.predecessors().size() == 1 : "predecessors size: " + p.predecessors().size(); + assert p.next() == null; + EndNode end = new EndNode(graph); + p.replace(end); + merge.addEnd(end); + target.firstInstruction = merge; + merge.setStateBefore(existingState); + first = merge; + } } existingState.merge((Merge) first, newState); } - - for (int j = 0; j < frameState.localsSize() + frameState.stackSize(); ++j) { - if (frameState.valueAt(j) != null) { - assert !frameState.valueAt(j).isDeleted(); - } - } } private void insertLoopPhis(Merge merge, FrameState newState) {