# HG changeset patch # User Thomas Wuerthinger # Date 1310055325 -7200 # Node ID ef0ff458d0747445661f18c42cf26f85d2fa25df # Parent 35effcd5e778942ed7a5e9527fca2d1c9dd429f9# Parent cb6e4d82ef3a2bab395dd3c854e72866fcbe0cbc Merge. diff -r 35effcd5e778 -r ef0ff458d074 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/alloc/LinearScan.java --- 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 objectStates = new HashMap(); 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())) { diff -r 35effcd5e778 -r ef0ff458d074 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AbstractMemoryCheckpointNode.java --- 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 mergedNodes() { - return inputs().variablePart(); + return variableInputs(); } } diff -r 35effcd5e778 -r ef0ff458d074 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/AccessNode.java --- 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 dependencies() { + return variableInputs(); + } + @Override public void print(LogStream out) { out.print("mem read from ").print(object()); diff -r 35effcd5e778 -r ef0ff458d074 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Anchor.java --- 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); diff -r 35effcd5e778 -r ef0ff458d074 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Compare.java --- 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()); } diff -r 35effcd5e778 -r ef0ff458d074 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/EndNode.java --- 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; } diff -r 35effcd5e778 -r ef0ff458d074 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/FixedGuard.java --- 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 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; diff -r 35effcd5e778 -r ef0ff458d074 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/MaterializeNode.java --- 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); } diff -r 35effcd5e778 -r ef0ff458d074 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 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 phiPredecessors() { - return Collections.unmodifiableList(inputs().variablePart()); + return Collections.unmodifiableList(variableInputs()); } } diff -r 35effcd5e778 -r ef0ff458d074 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/Phi.java --- 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 lookup(Class 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; + } + }; } diff -r 35effcd5e778 -r ef0ff458d074 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/CanonicalizerPhase.java --- 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++; } diff -r 35effcd5e778 -r ef0ff458d074 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/MemoryPhase.java --- 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) { diff -r 35effcd5e778 -r ef0ff458d074 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/ReadEliminationPhase.java --- 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()) { diff -r 35effcd5e778 -r ef0ff458d074 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 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; diff -r 35effcd5e778 -r ef0ff458d074 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 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 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 { diff -r 35effcd5e778 -r ef0ff458d074 graal/com.oracle.max.graal.runtime/src/com/oracle/max/graal/runtime/HotSpotRuntime.java --- 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();