changeset 3177:fe8423692c05

Merge.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Wed, 06 Jul 2011 21:47:47 +0200
parents bb38f184055d (current diff) ad788d3b0dc4 (diff)
children c7c5b06e92dd
files
diffstat 4 files changed, 79 insertions(+), 135 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NewArray.java	Wed Jul 06 21:43:07 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NewArray.java	Wed Jul 06 21:47:47 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<Object, Integer> 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;
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NewInstance.java	Wed Jul 06 21:43:07 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/ir/NewInstance.java	Wed Jul 06 21:47:47 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<Object, Integer> 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;
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java	Wed Jul 06 21:43:07 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/DeadCodeEliminationPhase.java	Wed Jul 06 21:47:47 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>(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());
-//                        }
-//                    }
                 }
             }
         }
--- a/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java	Wed Jul 06 21:43:07 2011 +0200
+++ b/graal/com.oracle.max.graal.compiler/src/com/oracle/max/graal/compiler/phases/EscapeAnalysisPhase.java	Wed Jul 06 21:47:47 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<BlockExitState>(next, startState) {
+            final BlockExitState startState = new BlockExitState(escapeFields, virtual);
+            final PostOrderNodeIterator<?> iterator = new PostOrderNodeIterator<BlockExitState>(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<Object, Integer> fieldIndex, Value[] fieldState);
+        public abstract int updateState(Node node, Node current, Map<Object, Integer> fieldIndex, Value[] fieldState);
 
     }
 }