changeset 3184:ef0ff458d074

Merge.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Thu, 07 Jul 2011 18:15:25 +0200
parents 35effcd5e778 (current diff) cb6e4d82ef3a (diff)
children 0baa318b28f5 48bad23422a7
files
diffstat 16 files changed, 117 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/LinearScan.java	Thu Jul 07 18:14:50 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/LinearScan.java	Thu Jul 07 18:15:25 2011 +0200
@@ -1953,7 +1953,7 @@
                 HashMap<VirtualObject, VirtualObjectField> objectStates = new HashMap<VirtualObject, VirtualObjectField>();
                 FrameState current = topState;
                 do {
-                    for (Node n : current.inputs().variablePart()) {
+                    for (Node n : current.virtualObjectMappings()) {
                         VirtualObjectField field = (VirtualObjectField) n;
                         // null states occur for objects with 0 fields
                         if (field != null && !objectStates.containsKey(field.object())) {
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AbstractMemoryCheckpointNode.java	Thu Jul 07 18:14:50 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AbstractMemoryCheckpointNode.java	Thu Jul 07 18:15:25 2011 +0200
@@ -49,6 +49,6 @@
     }
 
     public List<Node> mergedNodes() {
-        return inputs().variablePart();
+        return variableInputs();
     }
 }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessNode.java	Thu Jul 07 18:14:50 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessNode.java	Thu Jul 07 18:15:25 2011 +0200
@@ -22,6 +22,8 @@
  */
 package com.oracle.max.graal.compiler.ir;
 
+import java.util.*;
+
 import com.oracle.max.graal.compiler.debug.*;
 import com.oracle.max.graal.graph.*;
 import com.sun.cri.ci.*;
@@ -72,6 +74,14 @@
         setObject(object);
     }
 
+    public void addDependency(Node x) {
+        variableInputs().add(x);
+    }
+
+    public List<Node> dependencies() {
+        return variableInputs();
+    }
+
     @Override
     public void print(LogStream out) {
         out.print("mem read from ").print(object());
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Anchor.java	Thu Jul 07 18:14:50 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Anchor.java	Thu Jul 07 18:15:25 2011 +0200
@@ -44,6 +44,10 @@
         super(CiKind.Illegal, INPUT_COUNT, SUCCESSOR_COUNT, graph);
     }
 
+    public void addGuard(GuardNode x) {
+        variableInputs().add(x);
+    }
+
     @Override
     public void accept(ValueVisitor v) {
         v.visitAnchor(this);
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Compare.java	Thu Jul 07 18:14:50 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Compare.java	Thu Jul 07 18:15:25 2011 +0200
@@ -199,7 +199,7 @@
                     if (compare.condition == Condition.NE) {
                         isFalseCheck = !isFalseCheck;
                     }
-                    BooleanNode result = materializeNode.value();
+                    Value result = materializeNode.value();
                     if (isFalseCheck) {
                         result = new NegateBooleanNode(result, compare.graph());
                     }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/EndNode.java	Thu Jul 07 18:14:50 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/EndNode.java	Thu Jul 07 18:15:25 2011 +0200
@@ -66,7 +66,7 @@
         assertTrue(inputs().size() == 0, "inputs empty");
         assertTrue(successors().size() == 0, "successors empty");
         assertTrue(usages().size() <= 1, "at most one usage");
-        assertTrue(predecessors().size() <= 1, "at most one predecessor");
+        assertTrue(predecessors().size() <= 1, "at most one predecessor " + predecessors());
         return true;
     }
 
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FixedGuard.java	Thu Jul 07 18:14:50 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FixedGuard.java	Thu Jul 07 18:15:25 2011 +0200
@@ -22,6 +22,8 @@
  */
 package com.oracle.max.graal.compiler.ir;
 
+import java.util.*;
+
 import com.oracle.max.graal.compiler.*;
 import com.oracle.max.graal.compiler.debug.*;
 import com.oracle.max.graal.compiler.ir.Deoptimize.DeoptAction;
@@ -54,7 +56,7 @@
     }
 
     public void addNode(BooleanNode node) {
-        inputs().add(node);
+        variableInputs().add(node);
     }
 
     @Override
@@ -75,14 +77,16 @@
         @Override
         public Node canonical(Node node) {
             FixedGuard fixedGuard = (FixedGuard) node;
-            for (Node n : fixedGuard.inputs()) {
+            Iterator<Node> iter = fixedGuard.variableInputs().iterator();
+            while (iter.hasNext()) {
+                Node n = iter.next();
                 if (n instanceof Constant) {
                     Constant c = (Constant) n;
                     if (c.asConstant().asBoolean()) {
                         if (GraalOptions.TraceCanonicalizer) {
                             TTY.println("Removing redundant fixed guard " + fixedGuard);
                         }
-                        fixedGuard.inputs().remove(c);
+                        iter.remove();
                     } else {
                         if (GraalOptions.TraceCanonicalizer) {
                             TTY.println("Replacing fixed guard " + fixedGuard + " with deoptimization node");
@@ -92,7 +96,7 @@
                 }
             }
 
-            if (fixedGuard.inputs().size() == 0) {
+            if (fixedGuard.variableInputs().size() == 0) {
                 return fixedGuard.next();
             }
             return fixedGuard;
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/MaterializeNode.java	Thu Jul 07 18:14:50 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/MaterializeNode.java	Thu Jul 07 18:15:25 2011 +0200
@@ -52,11 +52,11 @@
     /**
      * The instruction which produces the input value to this instruction.
      */
-     public BooleanNode value() {
-        return (BooleanNode) inputs().get(super.inputCount() + INPUT_VALUE);
+     public Value value() {
+        return (Value) inputs().get(super.inputCount() + INPUT_VALUE);
     }
 
-    public void setValue(BooleanNode n) {
+    public void setValue(Value n) {
         inputs().set(super.inputCount() + INPUT_VALUE, n);
     }
 
@@ -67,7 +67,7 @@
      * @param kind the result type of this instruction
      * @param graph
      */
-    public MaterializeNode(BooleanNode value, Graph graph) {
+    public MaterializeNode(Value value, Graph graph) {
         super(CiKind.Int, INPUT_COUNT, SUCCESSOR_COUNT, graph);
         setValue(value);
     }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Merge.java	Thu Jul 07 18:14:50 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Merge.java	Thu Jul 07 18:15:25 2011 +0200
@@ -76,20 +76,20 @@
     }
 
     public int endIndex(EndNode end) {
-        assert inputs().variablePart().contains(end);
-        return inputs().variablePart().indexOf(end);
+        assert variableInputs().contains(end);
+        return variableInputs().indexOf(end);
     }
 
     public void addEnd(EndNode end) {
-        inputs().variablePart().add(end);
+        variableInputs().add(end);
     }
 
     public int endCount() {
-        return inputs().variablePart().size();
+        return variableInputs().size();
     }
 
     public EndNode endAt(int index) {
-        return (EndNode) inputs().variablePart().get(index);
+        return (EndNode) variableInputs().get(index);
     }
 
     @Override
@@ -310,9 +310,9 @@
     }
 
     public void removeEnd(EndNode pred) {
-        int predIndex = inputs().variablePart().indexOf(pred);
+        int predIndex = variableInputs().indexOf(pred);
         assert predIndex != -1;
-        inputs().variablePart().remove(predIndex);
+        variableInputs().remove(predIndex);
 
         for (Node usage : usages()) {
             if (usage instanceof Phi) {
@@ -339,6 +339,6 @@
     }
 
     public List<Node> phiPredecessors() {
-        return Collections.unmodifiableList(inputs().variablePart());
+        return Collections.unmodifiableList(variableInputs());
     }
 }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Phi.java	Thu Jul 07 18:14:50 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Phi.java	Thu Jul 07 18:15:25 2011 +0200
@@ -26,6 +26,7 @@
 
 import com.oracle.max.graal.compiler.debug.*;
 import com.oracle.max.graal.compiler.ir.StateSplit.*;
+import com.oracle.max.graal.compiler.phases.CanonicalizerPhase.*;
 import com.oracle.max.graal.graph.*;
 import com.sun.cri.ci.*;
 
@@ -101,7 +102,7 @@
      * @return the instruction that produced the value in the i'th predecessor
      */
     public Value valueAt(int i) {
-        return (Value) inputs().variablePart().get(i);
+        return (Value) variableInputs().get(i);
     }
 
     public void setValueAt(int i, Value x) {
@@ -113,7 +114,7 @@
      * @return the number of inputs in this phi
      */
     public int valueCount() {
-        return inputs().variablePart().size();
+        return variableInputs().size();
     }
 
     @Override
@@ -150,11 +151,11 @@
     }
 
     public void addInput(Node y) {
-        inputs().variablePart().add(y);
+        variableInputs().add(y);
     }
 
     public void removeInput(int index) {
-        inputs().variablePart().remove(index);
+        variableInputs().remove(index);
     }
 
     @Override
@@ -174,4 +175,62 @@
             }
         };
     }
+
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public <T extends Op> T lookup(Class<T> clazz) {
+        if (clazz == CanonicalizerOp.class) {
+            return (T) CANONICALIZER;
+        }
+        return super.lookup(clazz);
+    }
+
+    private static CanonicalizerOp CANONICALIZER = new CanonicalizerOp() {
+
+        @Override
+        public Node canonical(Node node) {
+            Phi phiNode = (Phi) node;
+//            if (phiNode.valueCount() != 2 || phiNode.merge().endCount() != 2 || phiNode.merge().phis().size() != 1) {
+//                return phiNode;
+//            }
+//            if (!(phiNode.valueAt(0) instanceof Constant && phiNode.valueAt(1) instanceof Constant)) {
+//                return phiNode;
+//            }
+//            Merge merge = phiNode.merge();
+//            Node end0 = merge.endAt(0);
+//            Node end1 = merge.endAt(1);
+//            if (end0.predecessors().size() != 1 || end1.predecessors().size() != 1) {
+//                return phiNode;
+//            }
+//            Node endPred0 = end0.predecessors().get(0);
+//            Node endPred1 = end1.predecessors().get(0);
+//            if (endPred0 != endPred1 || !(endPred0 instanceof If)) {
+//                return phiNode;
+//            }
+//            If ifNode = (If) endPred0;
+//            if (ifNode.predecessors().size() != 1) {
+//                return phiNode;
+//            }
+//            boolean inverted = ((If) endPred0).trueSuccessor() == end1;
+//            CiConstant trueValue = phiNode.valueAt(inverted ? 1 : 0).asConstant();
+//            CiConstant falseValue = phiNode.valueAt(inverted ? 0 : 1).asConstant();
+//            if (trueValue.kind != CiKind.Int || falseValue.kind != CiKind.Int) {
+//                return phiNode;
+//            }
+//            if ((trueValue.asInt() == 0 || trueValue.asInt() == 1) && (falseValue.asInt() == 0 || falseValue.asInt() == 1) && (trueValue.asInt() != falseValue.asInt())) {
+//                MaterializeNode result;
+//                if (trueValue.asInt() == 1) {
+//                    result = new MaterializeNode(ifNode.compare(), phiNode.graph());
+//                } else {
+//                    result = new MaterializeNode(new NegateBooleanNode(ifNode.compare(), phiNode.graph()), phiNode.graph());
+//                }
+//                Node next = merge.next();
+//                merge.setNext(null);
+//                ifNode.predecessors().get(0).successors().replace(ifNode, next);
+//                return result;
+//            }
+            return phiNode;
+        }
+    };
 }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/CanonicalizerPhase.java	Thu Jul 07 18:14:50 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/CanonicalizerPhase.java	Thu Jul 07 18:15:25 2011 +0200
@@ -42,7 +42,7 @@
                 Node canonical = op.canonical(node);
                 if (canonical != node) {
                     node.replaceAndDelete(canonical);
-                    nodeWorkList.replaced(canonical, node, EdgeType.USAGES);
+                    nodeWorkList.replaced(canonical, node, true, EdgeType.USAGES);
                     //System.out.println("-->" + n + " canonicalized to " + canonical);
                     GraalMetrics.NodesCanonicalized++;
                 }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/MemoryPhase.java	Thu Jul 07 18:14:50 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/MemoryPhase.java	Thu Jul 07 18:15:25 2011 +0200
@@ -198,7 +198,7 @@
             }
 
             // Create dependency on previous write to same location.
-            node.inputs().variablePart().add(getLocationForWrite(node));
+            node.addDependency(getLocationForWrite(node));
 
             locationForWrite.put(location, node);
             locationForRead.put(location, node);
@@ -220,7 +220,7 @@
             }
 
             // Create dependency on previous node that creates the memory state for this location.
-            node.inputs().variablePart().add(getLocationForRead(node));
+            node.addDependency(getLocationForRead(node));
         }
 
         public Node getLocationForRead(ReadNode node) {
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ReadEliminationPhase.java	Thu Jul 07 18:14:50 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ReadEliminationPhase.java	Thu Jul 07 18:15:25 2011 +0200
@@ -35,8 +35,8 @@
     @Override
     protected void run(Graph graph) {
         for (ReadNode n : graph.getNodes(ReadNode.class)) {
-            if (n.inputs().variablePart().size() > 0) {
-                Node memoryInput = n.inputs().variablePart().get(0);
+            if (n.dependencies().size() > 0) {
+                Node memoryInput = n.dependencies().get(0);
                 if (memoryInput instanceof WriteNode) {
                     WriteNode other = (WriteNode) memoryInput;
                     if (other.object() == n.object() && other.location() == n.location()) {
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java	Thu Jul 07 18:14:50 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/schedule/IdentifyBlocksPhase.java	Thu Jul 07 18:15:25 2011 +0200
@@ -474,7 +474,7 @@
             // TODO(tw): Make sure every ReadNode that is connected to the same memory state is executed before every write node.
             WriteNode wn = (WriteNode) i;
             // TODO: Iterate over variablePart.
-            wn.inputs().variablePart();
+//            wn.variableInputs();
         }
 
         FrameState state = null;
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameState.java	Thu Jul 07 18:14:50 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/value/FrameState.java	Thu Jul 07 18:15:25 2011 +0200
@@ -131,17 +131,20 @@
 
     public void addVirtualObjectMapping(Node virtualObject) {
         assert virtualObject instanceof VirtualObjectField || virtualObject instanceof Phi : virtualObject;
-        inputs().variablePart().add(virtualObject);
+        variableInputs().add(virtualObject);
     }
 
     public int virtualObjectMappingCount() {
-        return inputs().variablePart().size();
+        return variableInputs().size();
     }
 
     public Node virtualObjectMappingAt(int i) {
-        return inputs().variablePart().get(i);
+        return variableInputs().get(i);
     }
 
+    public List<Node> virtualObjectMappings() {
+        return variableInputs();
+    }
 
     /**
      * Gets a copy of this frame state.
@@ -149,7 +152,7 @@
     public FrameState duplicate(int bci) {
         FrameState other = new FrameState(method, bci, localsSize, stackSize, locksSize, rethrowException, graph());
         other.inputs().setAll(inputs());
-        other.inputs().variablePart().addAll(inputs().variablePart());
+        other.variableInputs().addAll(variableInputs());
         other.setOuterFrameState(outerFrameState());
         return other;
     }
@@ -181,7 +184,7 @@
         for (int i = 0; i < locksSize; i++) {
             other.setValueAt(localsSize + other.stackSize + i, lockAt(i));
         }
-        other.inputs().variablePart().addAll(inputs().variablePart());
+        other.variableInputs().addAll(variableInputs());
         other.setOuterFrameState(outerFrameState());
         return other;
     }
@@ -551,7 +554,7 @@
                 for (VirtualObject obj : vobjs) {
                     TTY.println("+" + obj);
                 }
-                for (Node vobj : inputs().variablePart()) {
+                for (Node vobj : variableInputs()) {
                     if (vobj instanceof VirtualObjectField) {
                         TTY.println("-" + ((VirtualObjectField) vobj).object());
                     } else {
--- a/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java	Thu Jul 07 18:14:50 2011 +0200
+++ b/graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java	Thu Jul 07 18:15:25 2011 +0200
@@ -301,7 +301,7 @@
             Graph graph = storeIndexed.graph();
             Anchor anchor = new Anchor(graph);
             GuardNode boundsCheck = createBoundsCheck(storeIndexed, tool);
-            anchor.inputs().add(boundsCheck);
+            anchor.addGuard(boundsCheck);
 
 
             CiKind elementKind = storeIndexed.elementKind();