# HG changeset patch # User Lukas Stadler # Date 1309967432 -7200 # Node ID ad788d3b0dc45c2512e25d55686714ab0cd60bf1 # Parent f9f3059830e994f21205d5f2116f86d811cd306b pulled common code from NewInstance and NewArray into EscapeOp diff -r f9f3059830e9 -r ad788d3b0dc4 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NewArray.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NewArray.java Wed Jul 06 17:15:43 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NewArray.java Wed Jul 06 17:50:32 2011 +0200 @@ -27,7 +27,6 @@ import com.oracle.max.graal.compiler.*; import com.oracle.max.graal.compiler.phases.EscapeAnalysisPhase.EscapeField; import com.oracle.max.graal.compiler.phases.EscapeAnalysisPhase.EscapeOp; -import com.oracle.max.graal.compiler.value.*; import com.oracle.max.graal.graph.*; import com.sun.cri.ci.*; @@ -118,19 +117,7 @@ @Override public boolean escape(Node node, Node usage) { - if (usage instanceof IsNonNull) { - IsNonNull x = (IsNonNull) usage; - assert x.object() == node; - return false; - } else if (usage instanceof IsType) { - IsType x = (IsType) usage; - assert x.object() == node; - return false; - } else if (usage instanceof FrameState) { - FrameState x = (FrameState) usage; - assert x.inputs().contains(node); - return true; - } else if (usage instanceof LoadIndexed) { + if (usage instanceof LoadIndexed) { LoadIndexed x = (LoadIndexed) usage; assert x.array() == node; CiConstant index = x.index().asConstant(); @@ -150,19 +137,15 @@ if (index == null || length == null || index.asInt() < 0 || index.asInt() >= length.asInt()) { return true; } - return x.value() == node; - } else if (usage instanceof AccessMonitor) { - AccessMonitor x = (AccessMonitor) usage; - assert x.object() == node; - return false; + return x.value() == node && x.array() != node; } else if (usage instanceof ArrayLength) { ArrayLength x = (ArrayLength) usage; assert x.array() == node; return false; - } else if (usage instanceof VirtualObject) { + } else if (usage instanceof VirtualObjectField) { return false; } else { - return true; + return super.escape(node, usage); } } @@ -180,45 +163,26 @@ @Override public void beforeUpdate(Node node, Node usage) { - if (usage instanceof IsNonNull) { - IsNonNull x = (IsNonNull) usage; - if (x.usages().size() == 1 && x.usages().get(0) instanceof FixedGuard) { - FixedGuard guard = (FixedGuard) x.usages().get(0); - guard.replaceAndDelete(guard.next()); - } - x.delete(); - } else if (usage instanceof IsType) { - IsType x = (IsType) usage; - assert x.type() == ((NewArray) node).exactType(); - if (x.usages().size() == 1 && x.usages().get(0) instanceof FixedGuard) { - FixedGuard guard = (FixedGuard) x.usages().get(0); - guard.replaceAndDelete(guard.next()); - } - x.delete(); - } else if (usage instanceof AccessMonitor) { - AccessMonitor x = (AccessMonitor) usage; - x.replaceAndDelete(x.next()); - } else if (usage instanceof ArrayLength) { + if (usage instanceof ArrayLength) { ArrayLength x = (ArrayLength) usage; x.replaceAndDelete(((NewArray) node).dimension(0)); + } else { + super.beforeUpdate(node, usage); } } @Override public int updateState(Node node, Node current, Map fieldIndex, Value[] fieldState) { if (current instanceof AccessIndexed) { - int index = ((AccessIndexed) current).index().asConstant().asInt(); - if (current instanceof LoadIndexed) { - LoadIndexed x = (LoadIndexed) current; - if (x.array() == node) { + AccessIndexed x = (AccessIndexed) current; + if (x.array() == node) { + int index = ((AccessIndexed) current).index().asConstant().asInt(); + if (current instanceof LoadIndexed) { x.replaceAtUsages(fieldState[index]); assert x.usages().size() == 0; x.replaceAndDelete(x.next()); - } - } else if (current instanceof StoreIndexed) { - StoreIndexed x = (StoreIndexed) current; - if (x.array() == node) { - fieldState[index] = x.value(); + } else if (current instanceof StoreIndexed) { + fieldState[index] = ((StoreIndexed) x).value(); assert x.usages().size() == 0; x.replaceAndDelete(x.next()); return index; diff -r f9f3059830e9 -r ad788d3b0dc4 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NewInstance.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NewInstance.java Wed Jul 06 17:15:43 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NewInstance.java Wed Jul 06 17:50:32 2011 +0200 @@ -27,7 +27,6 @@ import com.oracle.max.graal.compiler.debug.*; import com.oracle.max.graal.compiler.phases.EscapeAnalysisPhase.EscapeField; import com.oracle.max.graal.compiler.phases.EscapeAnalysisPhase.EscapeOp; -import com.oracle.max.graal.compiler.value.*; import com.oracle.max.graal.graph.*; import com.sun.cri.ci.*; import com.sun.cri.ri.*; @@ -117,41 +116,25 @@ @Override public boolean escape(Node node, Node usage) { - if (usage instanceof IsNonNull) { - IsNonNull x = (IsNonNull) usage; - assert x.object() == node; - return false; - } else if (usage instanceof IsType) { - IsType x = (IsType) usage; - assert x.object() == node; - return false; - } else if (usage instanceof FrameState) { - FrameState x = (FrameState) usage; - assert x.inputs().contains(node); - return true; - } else if (usage instanceof LoadField) { + if (usage instanceof LoadField) { LoadField x = (LoadField) usage; assert x.object() == node; return x.field().isResolved() == false; } else if (usage instanceof StoreField) { StoreField x = (StoreField) usage; - return x.value() == node; + return x.value() == node && x.object() != node; } else if (usage instanceof StoreIndexed) { StoreIndexed x = (StoreIndexed) usage; assert x.value() == node; return true; - } else if (usage instanceof AccessMonitor) { - AccessMonitor x = (AccessMonitor) usage; - assert x.object() == node; - return false; - } else if (usage instanceof VirtualObject) { + } else if (usage instanceof VirtualObjectField) { return false; } else if (usage instanceof RegisterFinalizer) { RegisterFinalizer x = (RegisterFinalizer) usage; assert x.object() == node; return false; } else { - return true; + return super.escape(node, usage); } } @@ -169,45 +152,27 @@ @Override public void beforeUpdate(Node node, Node usage) { - if (usage instanceof IsNonNull) { - IsNonNull x = (IsNonNull) usage; - if (x.usages().size() == 1 && x.usages().get(0) instanceof FixedGuard) { - FixedGuard guard = (FixedGuard) x.usages().get(0); - guard.replaceAndDelete(guard.next()); - } - x.delete(); - } else if (usage instanceof IsType) { - IsType x = (IsType) usage; - assert x.type() == ((NewInstance) node).instanceClass(); - if (x.usages().size() == 1 && x.usages().get(0) instanceof FixedGuard) { - FixedGuard guard = (FixedGuard) x.usages().get(0); - guard.replaceAndDelete(guard.next()); - } - x.delete(); - } else if (usage instanceof AccessMonitor) { - AccessMonitor x = (AccessMonitor) usage; - x.replaceAndDelete(x.next()); - } else if (usage instanceof RegisterFinalizer) { + if (usage instanceof RegisterFinalizer) { RegisterFinalizer x = (RegisterFinalizer) usage; x.replaceAndDelete(x.next()); + } else { + super.beforeUpdate(node, usage); } } @Override public int updateState(Node node, Node current, Map fieldIndex, Value[] fieldState) { if (current instanceof AccessField) { - if (((AccessField) current).object() == node) { - Integer field = fieldIndex.get(((AccessField) current).field()); - assert field != null : ((AccessField) current).field() + " " + ((AccessField) current).field().hashCode(); + AccessField x = (AccessField) current; + if (x.object() == node) { + int field = fieldIndex.get(((AccessField) current).field()); if (current instanceof LoadField) { - LoadField x = (LoadField) current; - assert fieldState[field] != null : field + ", " + ((AccessField) current).field() + ((AccessField) current).field().hashCode(); + assert fieldState[field] != null : field + ", " + ((AccessField) current).field(); x.replaceAtUsages(fieldState[field]); assert x.usages().size() == 0; x.replaceAndDelete(x.next()); } else if (current instanceof StoreField) { - StoreField x = (StoreField) current; - fieldState[field] = x.value(); + fieldState[field] = ((StoreField) x).value(); assert x.usages().size() == 0; x.replaceAndDelete(x.next()); return field; diff -r f9f3059830e9 -r ad788d3b0dc4 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java Wed Jul 06 17:15:43 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java Wed Jul 06 17:50:32 2011 +0200 @@ -104,29 +104,6 @@ endNode.replaceAndDelete(loop.next()); loop.delete(); } -// } else if (node instanceof Merge) { -// for (Node n : node.usages()) { -// if (n instanceof Phi) { -// Phi phi = (Phi) n; -// if (phi.usages().size() == 1 && phi.usages().get(0) instanceof VirtualObject) { -// // (tw) This VirtualObject instance is implicitely dead, because the CFG to it (i.e. the store that produced it) is dead! => fix this in escape analysis -// VirtualObject virtualObject = (VirtualObject) phi.usages().get(0); -// virtualObject.replaceAndDelete(virtualObject.object()); -// } -// } -// } -// } -// -// -// if (IdentifyBlocksPhase.isFixed(node)) { -// for (Node n : new ArrayList(node.usages())) { -// if (n instanceof VirtualObject) { -// // (tw) This VirtualObject instance is implicitely dead, because the CFG to it (i.e. the -// // store that produced it) is dead! => fix this in Escape analysis -// VirtualObject virtualObject = (VirtualObject) n; -// virtualObject.replaceAndDelete(virtualObject.object()); -// } -// } } } } diff -r f9f3059830e9 -r ad788d3b0dc4 graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java --- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java Wed Jul 06 17:15:43 2011 +0200 +++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java Wed Jul 06 17:50:32 2011 +0200 @@ -29,13 +29,12 @@ import com.oracle.max.graal.compiler.gen.*; import com.oracle.max.graal.compiler.graph.*; import com.oracle.max.graal.compiler.ir.*; -import com.oracle.max.graal.compiler.ir.Phi.*; +import com.oracle.max.graal.compiler.ir.Phi.PhiType; import com.oracle.max.graal.compiler.observer.*; import com.oracle.max.graal.compiler.schedule.*; import com.oracle.max.graal.compiler.value.*; import com.oracle.max.graal.graph.*; import com.sun.cri.ci.*; -import com.sun.cri.ri.*; public class EscapeAnalysisPhase extends Phase { @@ -64,7 +63,7 @@ this.state = initialState; } - public void apply(FixedNode start) { + public void apply() { FixedNode current = start; do { @@ -312,7 +311,6 @@ private final EscapeOp op; private final Graph graph; private final Node node; - private RiType type; private EscapeField[] escapeFields; public EscapementFixup(EscapeOp op, Graph graph, Node node) { @@ -329,13 +327,11 @@ public void removeAllocation() { assert node instanceof FixedNodeWithNext; - type = ((Value) node).exactType(); escapeFields = op.fields(node); for (int i = 0; i < escapeFields.length; i++) { fields.put(escapeFields[i].representation(), i); } - final VirtualObject virtual = new VirtualObject(type, escapeFields, graph); - final BlockExitState startState = new BlockExitState(escapeFields, virtual); + final VirtualObject virtual = new VirtualObject(((Value) node).exactType(), escapeFields, graph); if (GraalOptions.TraceEscapeAnalysis || GraalOptions.PrintEscapeAnalysis) { TTY.println("new virtual object: " + virtual); } @@ -343,7 +339,8 @@ final FixedNode next = ((FixedNodeWithNext) node).next(); node.replaceAndDelete(next); - new PostOrderNodeIterator(next, startState) { + final BlockExitState startState = new BlockExitState(escapeFields, virtual); + final PostOrderNodeIterator iterator = new PostOrderNodeIterator(next, startState) { @Override protected void node(FixedNode node) { int changedField = op.updateState(virtual, node, fields, state.fieldState); @@ -356,7 +353,8 @@ } } } - }.apply(next); + }; + iterator.apply(); } private void process() { @@ -498,17 +496,57 @@ } } - public static interface EscapeOp extends Op { + public abstract static class EscapeOp implements Op { + + public abstract boolean canAnalyze(Node node); - boolean canAnalyze(Node node); - - boolean escape(Node node, Node usage); + public boolean escape(Node node, Node usage) { + if (usage instanceof IsNonNull) { + IsNonNull x = (IsNonNull) usage; + assert x.object() == node; + return false; + } else if (usage instanceof IsType) { + IsType x = (IsType) usage; + assert x.object() == node; + return false; + } else if (usage instanceof FrameState) { + FrameState x = (FrameState) usage; + assert x.inputs().contains(node); + return true; + } else if (usage instanceof AccessMonitor) { + AccessMonitor x = (AccessMonitor) usage; + assert x.object() == node; + return false; + } else { + return true; + } + } - EscapeField[] fields(Node node); + public abstract EscapeField[] fields(Node node); - void beforeUpdate(Node node, Node usage); + public void beforeUpdate(Node node, Node usage) { + if (usage instanceof IsNonNull) { + IsNonNull x = (IsNonNull) usage; + if (x.usages().size() == 1 && x.usages().get(0) instanceof FixedGuard) { + FixedGuard guard = (FixedGuard) x.usages().get(0); + guard.replaceAndDelete(guard.next()); + } + x.delete(); + } else if (usage instanceof IsType) { + IsType x = (IsType) usage; + assert x.type() == ((Value) node).exactType(); + if (x.usages().size() == 1 && x.usages().get(0) instanceof FixedGuard) { + FixedGuard guard = (FixedGuard) x.usages().get(0); + guard.replaceAndDelete(guard.next()); + } + x.delete(); + } else if (usage instanceof AccessMonitor) { + AccessMonitor x = (AccessMonitor) usage; + x.replaceAndDelete(x.next()); + } + } - int updateState(Node node, Node current, Map fieldIndex, Value[] fieldState); + public abstract int updateState(Node node, Node current, Map fieldIndex, Value[] fieldState); } }