Mercurial > hg > truffle
changeset 2999:d1fd9d15eff3
Fix regression in graph builder.
author | Thomas Wuerthinger <thomas@wuerthinger.net> |
---|---|
date | Thu, 16 Jun 2011 15:10:37 +0200 |
parents | 775881292ddb |
children | 6c95d57cb1e2 |
files | graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/BlockEnd.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java |
diffstat | 2 files changed, 15 insertions(+), 34 deletions(-) [+] |
line wrap: on
line diff
--- 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 */
--- 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) {