Mercurial > hg > graal-jvmci-8
changeset 2964:5200f61105a9
Add end nodes before merge nodes.
author | Thomas Wuerthinger <thomas@wuerthinger.net> |
---|---|
date | Wed, 15 Jun 2011 12:22:23 +0200 |
parents | fc66984c2f31 |
children | df4edf02543a |
files | graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/EndNode.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java |
diffstat | 2 files changed, 21 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/EndNode.java Wed Jun 15 12:12:10 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/EndNode.java Wed Jun 15 12:22:23 2011 +0200 @@ -27,7 +27,7 @@ import com.sun.cri.ci.*; -public final class EndNode extends FixedNode { +public final class EndNode extends Instruction { public static final int SUCCESSOR_COUNT = 0; public static final int INPUT_COUNT = 0; public EndNode(Graph graph) {
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java Wed Jun 15 12:12:10 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java Wed Jun 15 12:22:23 2011 +0200 @@ -305,9 +305,16 @@ assert !target.isLoopHeader; Merge merge = new Merge(graph); + + Placeholder p = (Placeholder) first; + assert p.predecessors().size() == 1; assert p.next() == null; - p.replace(merge); + + Node pred = p.predecessors().get(0); + EndNode end = new EndNode(graph); + p.replace(end); + end.setNext(merge); target.firstInstruction = merge; merge.setStateBefore(existingState); first = merge; @@ -1134,11 +1141,21 @@ mergeOrClone(block, stateAfter); addToWorkList(block); + Instruction result = null; if (block.firstInstruction instanceof LoopBegin && isVisited(block)) { - return ((LoopBegin) block.firstInstruction).loopEnd(); + result = ((LoopBegin) block.firstInstruction).loopEnd(); } else { - return block.firstInstruction; + result = block.firstInstruction; } + + assert result instanceof Merge || result instanceof Placeholder : result; + + if (result instanceof Merge) { + EndNode end = new EndNode(graph); + end.setNext(result); + result = end; + } + return result; } private Value synchronizedObject(FrameStateAccess state, RiMethod target) {