changeset 3000:6c95d57cb1e2

Removed usage of stateBefore. Now framestate is always a successor of its associated node.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Thu, 16 Jun 2011 16:00:01 +0200
parents d1fd9d15eff3
children ef9afe6ffd5e
files graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/debug/IdealGraphPrinter.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/gen/LIRGenerator.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Merge.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/RegisterFinalizer.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/GraphBuilderPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/LoopPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameState.java
diffstat 8 files changed, 39 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- 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) {
--- 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);
     }
--- 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();
--- 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);
     }
 }
--- 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");
                 }
--- 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);
--- 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<Node> instructions = b.getInstructions();
-        List<Node> sortedInstructions = new ArrayList<Node>();
-        assert !map.isMarked(b.firstNode()) && nodeToBlock.get(b.firstNode()) == b;
-
-        boolean scheduleFirst = true;
-        assert !instructions.contains(b.lastNode());
-        assert !instructions.contains(b.firstNode());
+        List<Node> sortedInstructions = new ArrayList<Node>(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);
     }
 
--- 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;