# HG changeset patch # User Thomas Wuerthinger # Date 1308232801 -7200 # Node ID 6c95d57cb1e27c8ae65f58e11362ca43cca405ae # Parent d1fd9d15eff3b3b3ed623889c2715e5b143506bb Removed usage of stateBefore. Now framestate is always a successor of its associated node. diff -r d1fd9d15eff3 -r 6c95d57cb1e2 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java Thu Jun 16 15:10:37 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java Thu Jun 16 16:00:01 2011 +0200 @@ -236,8 +236,8 @@ } if (node instanceof Merge) { Merge merge = (Merge) node; - if (merge.stateBefore() != null) { - nodes.add(merge.stateBefore()); + if (merge.stateAfter() != null) { + nodes.add(merge.stateAfter()); } for (Node usage : merge.usages()) { if (usage instanceof Phi || usage instanceof LoopCounter) { diff -r d1fd9d15eff3 -r 6c95d57cb1e2 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java Thu Jun 16 15:10:37 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java Thu Jun 16 16:00:01 2011 +0200 @@ -241,7 +241,7 @@ stateAfter = ((Instruction) instr).stateAfter(); } FrameState stateBefore = null; - if (instr instanceof StateSplit && ((StateSplit) instr).stateBefore() != null) { + if (instr instanceof StateSplit && ((StateSplit) instr).stateAfter() != null) { stateBefore = ((StateSplit) instr).stateBefore(); } if (stateBefore != null) { @@ -1103,7 +1103,7 @@ @Override public void visitRegisterFinalizer(RegisterFinalizer x) { CiValue receiver = load(x.object()); - LIRDebugInfo info = stateFor(x, x.stateBefore()); + LIRDebugInfo info = stateFor(x); callRuntime(CiRuntimeCall.RegisterFinalizer, info, receiver); setNoResult(x); } diff -r d1fd9d15eff3 -r 6c95d57cb1e2 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Merge.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Merge.java Thu Jun 16 15:10:37 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Merge.java Thu Jun 16 16:00:01 2011 +0200 @@ -160,7 +160,7 @@ boolean hasPhisOnStack = false; //if (end() != null && end().stateAfter() != null) { - FrameState state = stateBefore(); + FrameState state = stateAfter(); int i = 0; while (!hasPhisOnStack && i < state.stackSize()) { @@ -213,8 +213,8 @@ out.println(); out.println("Stack:"); int j = 0; - while (j < stateBefore().stackSize()) { - Value value = stateBefore().stackAt(j); + while (j < stateAfter().stackSize()) { + Value value = stateAfter().stackAt(j); if (value != null) { out.println(stateString(j, value)); j += value.kind.sizeInSlots(); diff -r d1fd9d15eff3 -r 6c95d57cb1e2 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/RegisterFinalizer.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/RegisterFinalizer.java Thu Jun 16 15:10:37 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/RegisterFinalizer.java Thu Jun 16 16:00:01 2011 +0200 @@ -23,14 +23,13 @@ package com.oracle.max.graal.compiler.ir; import com.oracle.max.graal.compiler.debug.*; -import com.oracle.max.graal.compiler.value.*; import com.oracle.max.graal.graph.*; import com.sun.cri.ci.*; /** * This instruction is used to perform the finalizer registration at the end of the java.lang.Object constructor. */ -public class RegisterFinalizer extends StateSplit { +public final class RegisterFinalizer extends StateSplit { private static final int INPUT_COUNT = 1; private static final int INPUT_OBJECT = 0; @@ -58,10 +57,9 @@ return (Value) inputs().set(super.inputCount() + INPUT_OBJECT, n); } - public RegisterFinalizer(Value object, FrameState stateBefore, Graph graph) { + public RegisterFinalizer(Value object, Graph graph) { super(CiKind.Void, INPUT_COUNT, SUCCESSOR_COUNT, graph); setObject(object); - setStateBefore(stateBefore); } @Override @@ -76,7 +74,6 @@ @Override public Node copy(Graph into) { - RegisterFinalizer x = new RegisterFinalizer(null, null, into); - return x; + return new RegisterFinalizer(null, into); } } diff -r d1fd9d15eff3 -r 6c95d57cb1e2 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:10:37 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java Thu Jun 16 16:00:01 2011 +0200 @@ -272,7 +272,7 @@ int bci = target.startBci; - FrameState existingState = ((StateSplit) first).stateBefore(); + FrameState existingState = ((StateSplit) first).stateAfter(); if (existingState == null) { // copy state because it is modified @@ -282,9 +282,9 @@ if (first instanceof LoopBegin && target.isLoopHeader) { assert first instanceof Merge; insertLoopPhis((Merge) first, duplicate); - ((Merge) first).setStateBefore(duplicate); + ((Merge) first).setStateAfter(duplicate); } else { - ((StateSplit) first).setStateBefore(duplicate); + ((StateSplit) first).setStateAfter(duplicate); } } else { if (!GraalOptions.AssumeVerifiedBytecode && !existingState.isCompatibleWith(newState)) { @@ -300,7 +300,7 @@ Placeholder p = (Placeholder) first; assert !target.isLoopHeader; if (p.predecessors().size() == 0) { - p.setStateBefore(newState.duplicate(bci)); + p.setStateAfter(newState.duplicate(bci)); return; } else { Merge merge = new Merge(graph); @@ -310,7 +310,7 @@ p.replace(end); merge.addEnd(end); target.firstInstruction = merge; - merge.setStateBefore(existingState); + merge.setStateAfter(existingState); first = merge; } } @@ -407,7 +407,7 @@ FrameState entryState = frameState.duplicateWithEmptyStack(bci); StateSplit entry = new Placeholder(graph); - entry.setStateBefore(entryState); + entry.setStateAfter(entryState); Instruction currentNext = entry; Value currentExceptionObject = exceptionObject; @@ -981,7 +981,7 @@ if (needsCheck) { // append a call to the finalizer registration - append(new RegisterFinalizer(frameState.loadLocal(0), frameState.create(bci()), graph)); + append(new RegisterFinalizer(frameState.loadLocal(0), graph)); GraalMetrics.InlinedFinalizerChecks++; } } @@ -1177,7 +1177,7 @@ if (!isVisited(block)) { markVisited(block); // now parse the block - frameState.initializeFrom(((StateSplit) block.firstInstruction).stateBefore()); + frameState.initializeFrom(((StateSplit) block.firstInstruction).stateAfter()); lastInstr = block.firstInstruction; assert block.firstInstruction.next() == null : "instructions already appended at block " + block.blockID; @@ -1206,8 +1206,8 @@ // } catch (UnresolvedException iioe) { // } // } - if (end.stateBefore() != null) { - begin.stateBefore().merge(begin, end.stateBefore()); + if (end.stateAfter() != null) { + begin.stateAfter().merge(begin, end.stateAfter()); } else { end.delete(); Merge merge = new Merge(graph); @@ -1215,7 +1215,7 @@ merge.addEnd(begin.endAt(i)); } merge.setNext(begin.next()); - begin.setNext(null); + merge.setStateAfter(begin.stateAfter()); begin.replace(merge); TTY.println("replace loop"); } diff -r d1fd9d15eff3 -r 6c95d57cb1e2 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java Thu Jun 16 15:10:37 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java Thu Jun 16 16:00:01 2011 +0200 @@ -96,7 +96,7 @@ IntegerAdd add = (IntegerAdd) backEdge; int addUsageCount = 0; for (Node u : add.usages()) { - if (u != loopEnd.stateBefore() && u != phi) { + if (u != loopEnd.stateAfter() && u != phi) { addUsageCount++; } } @@ -114,7 +114,7 @@ LoopCounter counter = new LoopCounter(init.kind, init, stride, loopBegin, graph); counters.add(counter); phi.replace(counter); - loopEnd.stateBefore().inputs().replace(backEdge, counter); + loopEnd.stateAfter().inputs().replace(backEdge, counter); if (useCounterAfterAdd) { /*IntegerAdd otherInit = new IntegerAdd(init.kind, init, stride, graph); // would be nice to canonicalize LoopCounter otherCounter = new LoopCounter(init.kind, otherInit, stride, loopBegin, graph); diff -r d1fd9d15eff3 -r 6c95d57cb1e2 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java Thu Jun 16 15:10:37 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java Thu Jun 16 16:00:01 2011 +0200 @@ -315,27 +315,24 @@ private void sortNodesWithinBlocks(Block b, NodeBitMap map) { List instructions = b.getInstructions(); - List sortedInstructions = new ArrayList(); - assert !map.isMarked(b.firstNode()) && nodeToBlock.get(b.firstNode()) == b; - - boolean scheduleFirst = true; - assert !instructions.contains(b.lastNode()); - assert !instructions.contains(b.firstNode()); + List sortedInstructions = new ArrayList(instructions.size() + 2); - if (b.firstNode() == b.lastNode()) { - Node node = b.firstNode(); - if (!(node instanceof Merge) || node instanceof LoopEnd) { - scheduleFirst = false; - } - } - if (scheduleFirst) { - addToSorting(b, b.firstNode(), sortedInstructions, map); - } + assert !map.isMarked(b.firstNode()) && nodeToBlock.get(b.firstNode()) == b; + assert !instructions.contains(b.firstNode()); + assert !instructions.contains(b.lastNode()); + assert !map.isMarked(b.lastNode()) && nodeToBlock.get(b.lastNode()) == b; + + addToSorting(b, b.firstNode(), sortedInstructions, map); for (Node i : instructions) { addToSorting(b, i, sortedInstructions, map); } addToSorting(b, b.lastNode(), sortedInstructions, map); - assert sortedInstructions.get(sortedInstructions.size() - 1) == b.lastNode() : "lastNode=" + b.lastNode() + ", firstNode=" + b.firstNode() + ", sorted(sz-1)=" + sortedInstructions.get(sortedInstructions.size() - 1); + + // Make sure that last node gets really last (i.e. when a frame state successor hangs off it). + sortedInstructions.remove(b.lastNode()); + sortedInstructions.add(b.lastNode()); + + assert sortedInstructions.get(sortedInstructions.size() - 1) == b.lastNode() : " lastNode=" + b.lastNode() + ", firstNode=" + b.firstNode() + ", sorted(sz-1)=" + sortedInstructions.get(sortedInstructions.size() - 1); b.setInstructions(sortedInstructions); } diff -r d1fd9d15eff3 -r 6c95d57cb1e2 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameState.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameState.java Thu Jun 16 15:10:37 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameState.java Thu Jun 16 16:00:01 2011 +0200 @@ -398,9 +398,9 @@ } public Merge block() { - for (Node usage : usages()) { - if (usage instanceof Merge) { - return (Merge) usage; + for (Node preds : predecessors()) { + if (preds instanceof Merge) { + return (Merge) preds; } } return null;