changeset 5814:d241f8b2e6f9

Adapt the coloring filter for binary dumped graphs Update no framestate filter to also remove virtual nodes Improve binary serialization of fields and methods Made sure xml serialzer still works for dumping arrays in properties Added some nameTemplates Improved Name templates to optionaly use a short version of the elements Factored away elementType between NewPrimitiveArrayNode and NewObjectArrayNode into NewArrayNode restored Begin/End nodes shortNames
author Gilles Duboscq <duboscq@ssw.jku.at>
date Wed, 11 Jul 2012 14:13:38 +0200
parents 3b8bc07f8d17
children 272f9da7ce78
files graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/RegisterNode.java graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedGuardNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FrameState.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LocalNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ScheduledNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/RuntimeCallNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessFieldNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadFieldNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewArrayNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewObjectArrayNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewPrimitiveArrayNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreFieldNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualObjectNode.java graal/com.oracle.graal.printer/src/com/oracle/graal/printer/BinaryGraphPrinter.java graal/com.oracle.graal.printer/src/com/oracle/graal/printer/IdealGraphPrinter.java src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/BinaryParser.java src/share/tools/IdealGraphVisualizer/Graal/src/com/sun/hotspot/igv/graal/filters/color.filter src/share/tools/IdealGraphVisualizer/Graal/src/com/sun/hotspot/igv/graal/filters/noframestate.filter
diffstat 28 files changed, 342 insertions(+), 131 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.graph/src/com/oracle/graal/graph/Node.java	Wed Jul 11 14:13:38 2012 +0200
@@ -429,8 +429,6 @@
      * @param map
      */
     public Map<Object, Object> getDebugProperties(Map<Object, Object> map) {
-        map.put("usageCount", usages.size());
-        map.put("hasPredecessor", predecessor != null);
         getNodeClass().getDebugProperties(this, map);
         return map;
     }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/RegisterNode.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/RegisterNode.java	Wed Jul 11 14:13:38 2012 +0200
@@ -22,8 +22,6 @@
  */
 package com.oracle.graal.hotspot.nodes;
 
-import java.util.*;
-
 import com.oracle.graal.api.code.*;
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.graph.*;
--- a/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.java/src/com/oracle/graal/java/GraphBuilderPhase.java	Wed Jul 11 14:13:38 2012 +0200
@@ -696,7 +696,7 @@
     private void genNewPrimitiveArray(int typeCode) {
         Kind kind = arrayTypeCodeToKind(typeCode);
         ResolvedJavaType elementType = runtime.getResolvedJavaType(kind);
-        NewPrimitiveArrayNode nta = currentGraph.add(new NewPrimitiveArrayNode(frameState.ipop(), elementType));
+        NewPrimitiveArrayNode nta = currentGraph.add(new NewPrimitiveArrayNode(elementType, frameState.ipop()));
         frameState.apush(append(nta));
     }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginNode.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/BeginNode.java	Wed Jul 11 14:13:38 2012 +0200
@@ -62,13 +62,6 @@
     }
 
     @Override
-    public Map<Object, Object> getDebugProperties(Map<Object, Object> map) {
-        Map<Object, Object> debugProperties = super.getDebugProperties(map);
-        debugProperties.put("shortName", "B");
-        return debugProperties;
-    }
-
-    @Override
     public void simplify(SimplifierTool tool) {
         FixedNode prev = (FixedNode) this.predecessor();
         if (prev == null) {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/DeoptimizeNode.java	Wed Jul 11 14:13:38 2012 +0200
@@ -28,7 +28,7 @@
 import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.nodes.type.*;
 
-@NodeInfo(shortName = "Deopt")
+@NodeInfo(shortName = "Deopt", nameTemplate = "Deopt {p#reason/s}")
 public class DeoptimizeNode extends FixedNode implements Node.IterableNodeType, LIRLowerable {
 
     private String message;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedGuardNode.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FixedGuardNode.java	Wed Jul 11 14:13:38 2012 +0200
@@ -29,10 +29,11 @@
 import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.nodes.type.*;
 
+@NodeInfo(nameTemplate = "FixedGuard(!={p#negated}) {p#reason/s}")
 public final class FixedGuardNode extends FixedWithNextNode implements Simplifiable, Lowerable, LIRLowerable, Node.IterableNodeType, Negatable {
 
     @Input private BooleanNode condition;
-    private final DeoptimizationReason deoptReason;
+    private final DeoptimizationReason reason;
     private final DeoptimizationAction action;
     private boolean negated;
     private final long leafGraphId;
@@ -56,7 +57,7 @@
         this.negated = negated;
         this.leafGraphId = leafGraphId;
         this.condition = condition;
-        this.deoptReason = deoptReason;
+        this.reason = deoptReason;
     }
 
     @Override
@@ -70,7 +71,7 @@
 
     @Override
     public void generate(LIRGeneratorTool gen) {
-        gen.emitGuardCheck(condition, deoptReason, action, negated, leafGraphId);
+        gen.emitGuardCheck(condition, reason, action, negated, leafGraphId);
     }
 
     @Override
@@ -84,7 +85,7 @@
                 if (next != null) {
                     tool.deleteBranch(next);
                 }
-                setNext(graph().add(new DeoptimizeNode(DeoptimizationAction.InvalidateRecompile, deoptReason, leafGraphId)));
+                setNext(graph().add(new DeoptimizeNode(DeoptimizationAction.InvalidateRecompile, reason, leafGraphId)));
                 return;
             }
         }
@@ -92,7 +93,7 @@
 
     @Override
     public void lower(LoweringTool tool) {
-        ValueAnchorNode newAnchor = graph().add(new ValueAnchorNode(tool.createGuard(condition, deoptReason, action, negated, leafGraphId)));
+        ValueAnchorNode newAnchor = graph().add(new ValueAnchorNode(tool.createGuard(condition, reason, action, negated, leafGraphId)));
         ((StructuredGraph) graph()).replaceFixedWithFixed(this, newAnchor);
     }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FrameState.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/FrameState.java	Wed Jul 11 14:13:38 2012 +0200
@@ -35,6 +35,7 @@
  * The {@code FrameState} class encapsulates the frame state (i.e. local variables and
  * operand stack) at a particular point in the abstract interpretation.
  */
+@NodeInfo(nameTemplate = "FrameState@{p#method/s}:{p#bci}")
 public final class FrameState extends VirtualState implements Node.IterableNodeType, LIRLowerable {
 
     /**
@@ -355,24 +356,13 @@
     public Map<Object, Object> getDebugProperties(Map<Object, Object> map) {
         Map<Object, Object> properties = super.getDebugProperties(map);
         if (method != null) {
-            properties.put("method", MetaUtil.format("%H.%n(%p):%r", method));
+            //properties.put("method", MetaUtil.format("%H.%n(%p):%r", method));
             StackTraceElement ste = method.toStackTraceElement(bci);
             if (ste.getFileName() != null && ste.getLineNumber() >= 0) {
-                properties.put("source", ste.getFileName() + ":" + ste.getLineNumber());
+                properties.put("sourceFile", ste.getFileName());
+                properties.put("sourceLine", ste.getLineNumber());
             }
-        } else {
-            properties.put("method", "None");
         }
-        StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < localsSize(); i++) {
-            sb.append(i == 0 ? "" : ", ").append(localAt(i) == null ? "_" : localAt(i).toString(Verbosity.Id));
-        }
-        properties.put("locals", sb.toString());
-        sb = new StringBuilder();
-        for (int i = 0; i < stackSize(); i++) {
-            sb.append(i == 0 ? "" : ", ").append(stackAt(i) == null ? "_" : stackAt(i).toString(Verbosity.Id));
-        }
-        properties.put("stack", sb.toString());
         return properties;
     }
 
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardNode.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/GuardNode.java	Wed Jul 11 14:13:38 2012 +0200
@@ -41,6 +41,7 @@
  * maximum flexibility for the guard node and guarantees that deoptimization occurs only if the control flow would have
  * reached the guarded node (without taking exceptions into account).
  */
+@NodeInfo(nameTemplate = "Guard(!={p#negated}) {p#reason/s}")
 public final class GuardNode extends FloatingNode implements Canonicalizable, LIRLowerable, TypeFeedbackProvider, Node.IterableNodeType, Negatable {
 
     @Input private BooleanNode condition;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeNode.java	Wed Jul 11 14:13:38 2012 +0200
@@ -34,7 +34,7 @@
 /**
  * The {@code InvokeNode} represents all kinds of method calls.
  */
-@NodeInfo(nameTemplate = "Invoke#{p#targetMethod}")
+@NodeInfo(nameTemplate = "Invoke#{p#targetMethod/s}")
 public final class InvokeNode extends AbstractStateSplit implements StateSplit, Node.IterableNodeType, Invoke, LIRLowerable, MemoryCheckpoint  {
 
     @Input private final MethodCallTargetNode callTarget;
@@ -90,7 +90,7 @@
     public Map<Object, Object> getDebugProperties(Map<Object, Object> map) {
         Map<Object, Object> debugProperties = super.getDebugProperties(map);
         if (callTarget != null && callTarget.targetMethod() != null) {
-            debugProperties.put("targetMethod", MetaUtil.format("%h.%n(%p)", callTarget.targetMethod()));
+            debugProperties.put("targetMethod", callTarget.targetMethod());
         }
         return debugProperties;
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/InvokeWithExceptionNode.java	Wed Jul 11 14:13:38 2012 +0200
@@ -30,7 +30,7 @@
 import com.oracle.graal.nodes.java.*;
 import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.nodes.util.*;
-@NodeInfo(nameTemplate = "Invoke!#{p#targetMethod}")
+@NodeInfo(nameTemplate = "Invoke!#{p#targetMethod/s}")
 public class InvokeWithExceptionNode extends ControlSplitNode implements Node.IterableNodeType, Invoke, MemoryCheckpoint, LIRLowerable {
     public static final int NORMAL_EDGE = 0;
     public static final int EXCEPTION_EDGE = 1;
@@ -154,9 +154,8 @@
     @Override
     public Map<Object, Object> getDebugProperties(Map<Object, Object> map) {
         Map<Object, Object> debugProperties = super.getDebugProperties(map);
-        debugProperties.put("memoryCheckpoint", "true");
         if (callTarget != null && callTarget.targetMethod() != null) {
-            debugProperties.put("targetMethod", MetaUtil.format("%h.%n(%p)", callTarget.targetMethod()));
+            debugProperties.put("targetMethod", callTarget.targetMethod());
         }
         return debugProperties;
     }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LocalNode.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/LocalNode.java	Wed Jul 11 14:13:38 2012 +0200
@@ -30,7 +30,7 @@
  * The {@code Local} instruction is a placeholder for an incoming argument
  * to a function call.
  */
-
+@NodeInfo(nameTemplate = "Local({p#index})")
 public final class LocalNode extends FloatingNode implements Node.IterableNodeType {
 
     private final int index;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/PhiNode.java	Wed Jul 11 14:13:38 2012 +0200
@@ -32,7 +32,7 @@
  * The {@code PhiNode} represents the merging of dataflow in the graph. It refers to a merge
  * and a variable.
  */
-@NodeInfo(nameTemplate = "Phi({i#values})")
+@NodeInfo(nameTemplate = "{p#type/s}Phi({i#values})")
 public final class PhiNode extends FloatingNode implements Canonicalizable, Node.IterableNodeType {
 
     public static enum PhiType {
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ScheduledNode.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ScheduledNode.java	Wed Jul 11 14:13:38 2012 +0200
@@ -22,8 +22,6 @@
  */
 package com.oracle.graal.nodes;
 
-import java.util.*;
-
 import com.oracle.graal.graph.*;
 
 public abstract class ScheduledNode extends Node {
@@ -38,17 +36,4 @@
         updatePredecessor(scheduledNext, x);
         scheduledNext = x;
     }
-
-    @Override
-    public Map<Object, Object> getDebugProperties(Map<Object, Object> map) {
-        Map<Object, Object> debugProperties = super.getDebugProperties(map);
-        if (this instanceof StateSplit) {
-            StateSplit stateSplit = (StateSplit) this;
-            if (stateSplit.stateAfter() != null) {
-                debugProperties.put("stateAfter", stateSplit.stateAfter().toString(Verbosity.Debugger));
-            }
-        }
-        return debugProperties;
-    }
-
 }
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/LocationNode.java	Wed Jul 11 14:13:38 2012 +0200
@@ -33,6 +33,7 @@
  * A location for a memory access in terms of the kind of value accessed and the displacement
  * (in bytes) from a base object or address.
  */
+@NodeInfo(nameTemplate = "Loc {p#locationIdentity/s}")
 public class LocationNode extends FloatingNode implements LIRLowerable, ValueNumberable {
 
     private int displacement;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/RuntimeCallNode.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/RuntimeCallNode.java	Wed Jul 11 14:13:38 2012 +0200
@@ -23,10 +23,12 @@
 package com.oracle.graal.nodes.extended;
 
 import com.oracle.graal.api.code.*;
+import com.oracle.graal.graph.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.nodes.type.*;
 
+@NodeInfo(nameTemplate = "RuntimeCall#{p#call/s}")
 public final class RuntimeCallNode extends AbstractCallNode implements LIRLowerable {
 
     private final RuntimeCall call;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessFieldNode.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/AccessFieldNode.java	Wed Jul 11 14:13:38 2012 +0200
@@ -23,7 +23,6 @@
 package com.oracle.graal.nodes.java;
 
 import java.lang.reflect.*;
-import java.util.*;
 
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.nodes.*;
@@ -91,13 +90,6 @@
     }
 
     @Override
-    public Map<Object, Object> getDebugProperties(Map<Object, Object> map) {
-        Map<Object, Object> debugProperties = super.getDebugProperties(map);
-        debugProperties.put("field", MetaUtil.format("%h.%n", field));
-        return debugProperties;
-    }
-
-    @Override
     public String toString(Verbosity verbosity) {
         if (verbosity == Verbosity.Name) {
             return super.toString(verbosity) + "#" + field.name();
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadFieldNode.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/LoadFieldNode.java	Wed Jul 11 14:13:38 2012 +0200
@@ -31,6 +31,7 @@
 /**
  * The {@code LoadFieldNode} represents a read of a static or instance field.
  */
+@NodeInfo(nameTemplate = "LoadField#{p#field/s}")
 public final class LoadFieldNode extends AccessFieldNode implements Canonicalizable, Node.IterableNodeType {
 
     /**
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewArrayNode.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewArrayNode.java	Wed Jul 11 14:13:38 2012 +0200
@@ -39,6 +39,7 @@
 public abstract class NewArrayNode extends FixedWithNextNode implements Lowerable, EscapeAnalyzable, TypeFeedbackProvider {
 
     @Input private ValueNode length;
+    private final ResolvedJavaType elementType;
 
     public static final int MaximumEscapeAnalysisArrayLength = 32;
 
@@ -50,9 +51,10 @@
      * Constructs a new NewArrayNode.
      * @param length the node that produces the length for this allocation
      */
-    protected NewArrayNode(Stamp stamp, ValueNode length) {
-        super(stamp);
+    protected NewArrayNode(ResolvedJavaType elementType, ValueNode length) {
+        super(StampFactory.exactNonNull(elementType.arrayOf()));
         this.length = length;
+        this.elementType = elementType;
     }
 
     /**
@@ -64,18 +66,20 @@
     }
 
     /**
+     * Gets the element type of the array.
+     * @return the element type of the array
+     */
+    public ResolvedJavaType elementType() {
+        return elementType;
+    }
+
+    /**
      * The rank of the array allocated by this node, i.e. how many array dimensions.
      */
     public int dimensionCount() {
         return 1;
     }
 
-    /**
-     * Gets the element type of the array.
-     * @return the element type of the array
-     */
-    public abstract ResolvedJavaType elementType();
-
     @Override
     public void typeFeedback(TypeFeedbackTool tool) {
         assert length.kind() == Kind.Int;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewInstanceNode.java	Wed Jul 11 14:13:38 2012 +0200
@@ -34,6 +34,7 @@
 /**
  * The {@code NewInstanceNode} represents the allocation of an instance class object.
  */
+@NodeInfo(nameTemplate = "New {p#instanceClass/s}")
 public final class NewInstanceNode extends FixedWithNextNode implements EscapeAnalyzable, Lowerable, LIRLowerable, Node.IterableNodeType {
 
     private final ResolvedJavaType instanceClass;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewObjectArrayNode.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewObjectArrayNode.java	Wed Jul 11 14:13:38 2012 +0200
@@ -26,28 +26,20 @@
 import com.oracle.graal.graph.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.spi.*;
-import com.oracle.graal.nodes.type.*;
 
 /**
  * The {@code NewObjectArrayNode} represents an allocation of an object array.
  */
+@NodeInfo(nameTemplate = "NewArray {p#elementType}")
 public final class NewObjectArrayNode extends NewArrayNode implements LIRLowerable, Node.IterableNodeType {
 
-    private final ResolvedJavaType elementClass;
-
     /**
      * Constructs a new NewObjectArrayNode.
      * @param elementClass the class of elements in this array
      * @param length the node producing the length of the array
      */
     public NewObjectArrayNode(ResolvedJavaType elementClass, ValueNode length) {
-        super(StampFactory.exactNonNull(elementClass.arrayOf()), length);
-        this.elementClass = elementClass;
-    }
-
-    @Override
-    public ResolvedJavaType elementType() {
-        return elementClass;
+        super(elementClass, length);
     }
 
     @Override
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewPrimitiveArrayNode.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/NewPrimitiveArrayNode.java	Wed Jul 11 14:13:38 2012 +0200
@@ -23,25 +23,18 @@
 package com.oracle.graal.nodes.java;
 
 import com.oracle.graal.api.meta.*;
+import com.oracle.graal.graph.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.spi.*;
-import com.oracle.graal.nodes.type.*;
 
 /**
  * The {@code NewPrimitiveArrayNode} class definition.
  */
+@NodeInfo(nameTemplate = "NewArray {p#elementType}")
 public final class NewPrimitiveArrayNode extends NewArrayNode implements LIRLowerable {
 
-    private final ResolvedJavaType elementType;
-
-    public NewPrimitiveArrayNode(ValueNode length, ResolvedJavaType elementType) {
-        super(StampFactory.exactNonNull(elementType.arrayOf()), length);
-        this.elementType = elementType;
-    }
-
-    @Override
-    public ResolvedJavaType elementType() {
-        return elementType;
+    public NewPrimitiveArrayNode(ResolvedJavaType elementType, ValueNode length) {
+        super(elementType, length);
     }
 
     @Override
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreFieldNode.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/StoreFieldNode.java	Wed Jul 11 14:13:38 2012 +0200
@@ -23,12 +23,14 @@
 package com.oracle.graal.nodes.java;
 
 import com.oracle.graal.api.meta.*;
+import com.oracle.graal.graph.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.type.*;
 
 /**
  * The {@code StoreFieldNode} represents a write to a static or instance field.
  */
+@NodeInfo(nameTemplate = "StoreField#{p#field/s}")
 public final class StoreFieldNode extends AccessFieldNode implements StateSplit {
 
     @Input private ValueNode value;
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualObjectNode.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/virtual/VirtualObjectNode.java	Wed Jul 11 14:13:38 2012 +0200
@@ -23,10 +23,11 @@
 package com.oracle.graal.nodes.virtual;
 
 import com.oracle.graal.api.meta.*;
+import com.oracle.graal.graph.*;
 import com.oracle.graal.nodes.calc.*;
 import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.nodes.type.*;
-
+@NodeInfo(nameTemplate = "VirtualObject {p#type}")
 public class VirtualObjectNode extends FloatingNode implements LIRLowerable {
 
     private ResolvedJavaType type;
--- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/BinaryGraphPrinter.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/BinaryGraphPrinter.java	Wed Jul 11 14:13:38 2012 +0200
@@ -50,6 +50,8 @@
     private static final int POOL_METHOD = 0x04;
     private static final int POOL_NULL = 0x05;
     private static final int POOL_NODE_CLASS = 0x06;
+    private static final int POOL_FIELD = 0x07;
+    private static final int POOL_SIGNATURE = 0x08;
 
     private static final int PROPERTY_POOL = 0x00;
     private static final int PROPERTY_INT = 0x01;
@@ -63,11 +65,11 @@
     private static final int KLASS = 0x00;
     private static final int ENUM_KLASS = 0x01;
 
-    private static final class CosntantPool extends LinkedHashMap<Object, Integer> {
+    private static final class ConstantPool extends LinkedHashMap<Object, Integer> {
         private final LinkedList<Integer> availableIds;
         private int nextId;
         private static final long serialVersionUID = -2676889957907285681L;
-        public CosntantPool() {
+        public ConstantPool() {
             super(50, 0.65f);
             availableIds = new LinkedList<>();
         }
@@ -94,14 +96,14 @@
         }
     }
 
-    private final CosntantPool constantPool;
+    private final ConstantPool constantPool;
     private final ByteBuffer buffer;
     private final WritableByteChannel channel;
     private long bytes;
     private long newPoolEntry;
 
     public BinaryGraphPrinter(WritableByteChannel channel) {
-        constantPool = new CosntantPool();
+        constantPool = new ConstantPool();
         buffer = ByteBuffer.allocateDirect(256 * 1024);
         this.channel = channel;
     }
@@ -221,6 +223,10 @@
             writeByte(POOL_NULL);
             return;
         }
+        if (object instanceof ResolvedJavaType) {
+            writePoolObject(((ResolvedJavaType) object).toJava());
+            return;
+        }
         Integer id = constantPool.get(object);
         if (id == null) {
             addPoolEntry(object);
@@ -233,6 +239,10 @@
                 writeByte(POOL_NODE_CLASS);
             } else if (object instanceof ResolvedJavaMethod) {
                 writeByte(POOL_METHOD);
+            } else if (object instanceof ResolvedJavaField) {
+                writeByte(POOL_FIELD);
+            } else if (object instanceof Signature) {
+                writeByte(POOL_SIGNATURE);
             } else {
                 writeByte(POOL_STRING);
             }
@@ -280,7 +290,28 @@
             }
         } else if (object instanceof ResolvedJavaMethod) {
             writeByte(POOL_METHOD);
-            writeBytes(((ResolvedJavaMethod) object).code());
+            ResolvedJavaMethod method = ((ResolvedJavaMethod) object);
+            writePoolObject(method.holder());
+            writePoolObject(method.name());
+            writePoolObject(method.signature());
+            writeInt(method.accessFlags());
+            writeBytes(method.code());
+        } else if (object instanceof ResolvedJavaField) {
+            writeByte(POOL_FIELD);
+            ResolvedJavaField field = ((ResolvedJavaField) object);
+            writePoolObject(field.holder());
+            writePoolObject(field.name());
+            writePoolObject(field.type().name());
+            writeInt(field.accessFlags());
+        } else if (object instanceof Signature) {
+            writeByte(POOL_SIGNATURE);
+            Signature signature = ((Signature) object);
+            int args = signature.argumentCount(false);
+            writeShort((char) args);
+            for (int i = 0; i < args; i++) {
+                writePoolObject(signature.argumentTypeAt(i, null).name());
+            }
+            writePoolObject(signature.returnType(null).name());
         } else {
             writeByte(POOL_STRING);
             writeString(object.toString());
@@ -345,6 +376,7 @@
             node.getDebugProperties(props);
             writeInt(node.getId());
             writePoolObject(nodeClass);
+            writeByte(node.predecessor() == null ? 0 : 1);
             writeShort((char) props.size());
             for (Entry<Object, Object> entry : props.entrySet()) {
                 String key = entry.getKey().toString();
--- a/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/IdealGraphPrinter.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/graal/com.oracle.graal.printer/src/com/oracle/graal/printer/IdealGraphPrinter.java	Wed Jul 11 14:13:38 2012 +0200
@@ -158,11 +158,38 @@
                     printProperty(bit, "true");
                 }
             }
+            if (node.getClass() == BeginNode.class) {
+                printProperty("shortName", "B");
+            } else if (node.getClass() == EndNode.class) {
+                printProperty("shortName", "E");
+            }
+            if (node.predecessor() != null) {
+                printProperty("hasPredecessor", "true");
+            }
 
             for (Entry<Object, Object> entry : props.entrySet()) {
                 String key = entry.getKey().toString();
-                String value = entry.getValue() == null ? "null" : entry.getValue().toString();
-                printProperty(key, value);
+                Object value = entry.getValue();
+                String valueString;
+                if (value == null) {
+                    valueString = "null";
+                } else {
+                    Class<?> type = value.getClass();
+                    if (type.isArray()) {
+                        if (!type.getComponentType().isPrimitive()) {
+                            valueString = Arrays.toString((Object[]) value);
+                        } else if (type.getComponentType() == Integer.TYPE) {
+                            valueString = Arrays.toString((int[]) value);
+                        } else if (type.getComponentType() == Double.TYPE) {
+                            valueString = Arrays.toString((double[]) value);
+                        } else {
+                            valueString = toString();
+                        }
+                    } else {
+                        valueString = value.toString();
+                    }
+                }
+                printProperty(key, valueString);
             }
 
             endProperties();
--- a/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/BinaryParser.java	Tue Jul 10 15:02:41 2012 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/BinaryParser.java	Wed Jul 11 14:13:38 2012 +0200
@@ -5,15 +5,13 @@
 package com.sun.hotspot.igv.data.serialization;
 
 import com.sun.hotspot.igv.data.*;
+import com.sun.hotspot.igv.data.Properties;
 import com.sun.hotspot.igv.data.services.GroupCallback;
 import java.io.EOFException;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.channels.ReadableByteChannel;
-import java.util.ArrayList;
-import java.util.Deque;
-import java.util.LinkedList;
-import java.util.List;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import javax.swing.SwingUtilities;
@@ -34,6 +32,8 @@
     private static final int POOL_METHOD = 0x04;
     private static final int POOL_NULL = 0x05;
     private static final int POOL_NODE_CLASS = 0x06;
+    private static final int POOL_FIELD = 0x07;
+    private static final int POOL_SIGNATURE = 0x08;
     
     private static final int KLASS = 0x00;
     private static final int ENUM_KLASS = 0x01;
@@ -51,21 +51,131 @@
     
     private GroupCallback callback;
     private List<Object> constantPool;
-    private int maxConstant;
     private final ByteBuffer buffer;
     private final ReadableByteChannel channel;
     private Deque<Folder> folderStack;
-    private boolean close;
+    
+    private enum Length {
+        S,
+        M,
+        L
+    }
     
-    private static class Klass {
-        public String name;
-        public Klass(String name) {
+    private interface LengthToString {
+        String toString(Length l);
+    }
+    
+    private static abstract class Member implements LengthToString {
+        public final Klass holder;
+        public final int accessFlags;
+        public final String name;
+        public Member(Klass holder, String name, int accessFlags) {
+            this.holder = holder;
+            this.accessFlags = accessFlags;
             this.name = name;
         }
     }
     
+    private static class Method extends Member {
+        public final Signature signature;
+        public final byte[] code;
+        public Method(String name, Signature signature, byte[] code, Klass holder, int accessFlags) {
+            super(holder, name, accessFlags);
+            this.signature = signature;
+            this.code = code;
+        }
+        @Override
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append(holder).append('.').append(name).append('(');
+            for (int i = 0; i < signature.argTypes.length; i++) {
+                if (i > 0) {
+                    sb.append(", ");
+                }
+                sb.append(signature.argTypes[i]);
+            }
+            sb.append(')');
+            return sb.toString();
+        }
+        @Override
+        public String toString(Length l) {
+            switch(l) {
+                case M:
+                    return holder.toString(Length.L) + "." + name;
+                case S:
+                    return holder.toString(Length.S) + "." + name;
+                default:
+                case L:
+                    return toString();
+            }
+        }
+    }
+    
+    private static class Signature {
+        public final String returnType;
+        public final String[] argTypes;
+        public Signature(String returnType, String[] argTypes) {
+            this.returnType = returnType;
+            this.argTypes = argTypes;
+        }
+    }
+    
+    private static class Field extends Member {
+        public final String type;
+        public Field(String type, Klass holder, String name, int accessFlags) {
+            super(holder, name, accessFlags);
+            this.type = type;
+        }
+        @Override
+        public String toString() {
+            return holder + "." + name;
+        }
+        @Override
+        public String toString(Length l) {
+            switch(l) {
+                case M:
+                    return holder.toString(Length.L) + "." + name;
+                case S:
+                    return holder.toString(Length.S) + "." + name;
+                default:
+                case L:
+                    return toString();
+            }
+        }
+    }
+    
+    private static class Klass implements LengthToString {
+        public final String name;
+        public final String simpleName;
+        public Klass(String name) {
+            this.name = name;
+            String simple;
+            try {
+                simple = name.substring(name.lastIndexOf('.') + 1);
+            } catch (IndexOutOfBoundsException ioobe) {
+                simple = name;
+            }
+            this.simpleName = simple;
+        }
+        @Override
+        public String toString() {
+            return name;
+        }
+        @Override
+        public String toString(Length l) {
+            switch(l) {
+                case S:
+                    return simpleName;
+                default:
+                case L:
+                case M:
+                    return toString();
+            }
+        }
+    }
+    
     private static class EnumKlass extends Klass {
-        public String[] values;
+        public final String[] values;
         public EnumKlass(String name, String[] values) {
             super(name);
             this.values = values;
@@ -83,15 +193,34 @@
             this.inputs = inputs;
             this.sux = sux;
         }
+        @Override
+        public String toString() {
+            return className;
+        }
     }
     
-    private static class EnumValue {
+    private static class EnumValue implements LengthToString {
         public EnumKlass enumKlass;
         public int ordinal;
         public EnumValue(EnumKlass enumKlass, int ordinal) {
             this.enumKlass = enumKlass;
             this.ordinal = ordinal;
         }
+        @Override
+        public String toString() {
+            return enumKlass.simpleName + "." + enumKlass.values[ordinal];
+        }
+        @Override
+        public String toString(Length l) {
+            switch(l) {
+                case S:
+                    return enumKlass.values[ordinal];
+                default:
+                case M:
+                case L:
+                    return toString();
+            }
+        }
     }
 
     public BinaryParser(GroupCallback callback, ReadableByteChannel channel) {
@@ -226,6 +355,7 @@
         if (type == POOL_NEW) {
             return (T) addPoolEntry(klass);
         }
+        assert assertObjectType(klass, type);
         int index = readInt();
         if (index < 0 || index >= constantPool.size()) {
             throw new IOException("Invalid constant pool index : " + index);
@@ -241,11 +371,15 @@
             case POOL_ENUM:
                 return klass.isAssignableFrom(EnumValue.class);
             case POOL_METHOD:
-                return klass.isAssignableFrom(byte[].class);
+                return klass.isAssignableFrom(Method.class);
             case POOL_STRING:
                 return klass.isAssignableFrom(String.class);
             case POOL_NODE_CLASS:
                 return klass.isAssignableFrom(NodeClass.class);
+            case POOL_FIELD:
+                return klass.isAssignableFrom(Field.class);
+            case POOL_SIGNATURE:
+                return klass.isAssignableFrom(Signature.class);
             case POOL_NULL:
                 return true;
             default:
@@ -259,7 +393,7 @@
         assert assertObjectType(klass, type) : "Wrong object type : " + klass + " != " + type;
         Object obj;
         switch(type) {
-            case POOL_CLASS:
+            case POOL_CLASS: {
                 String name = readString();
                 int klasstype = readByte();
                 if (klasstype == ENUM_KLASS) {
@@ -275,12 +409,14 @@
                     throw new IOException("unknown klass type : " + klasstype);
                 }
                 break;
-            case POOL_ENUM:
+            }
+            case POOL_ENUM: {
                 EnumKlass enumClass = readPoolObject(EnumKlass.class);
                 int ordinal = readInt();
                 obj = new EnumValue(enumClass, ordinal);
                 break;
-            case POOL_NODE_CLASS:
+            }
+            case POOL_NODE_CLASS: {
                 String className = readString();
                 String nameTemplate = readString();
                 int inputCount = readShort();
@@ -295,12 +431,38 @@
                 }
                 obj = new NodeClass(className, nameTemplate, inputs, sux);
                 break;
-            case POOL_METHOD:
-                obj = readBytes();
+            }
+            case POOL_METHOD: {
+                Klass holder = readPoolObject(Klass.class);
+                String name = readPoolObject(String.class);
+                Signature sign = readPoolObject(Signature.class);
+                int flags = readInt();
+                byte[] code = readBytes();
+                obj = new Method(name, sign, code, holder, flags);
                 break;
-            case POOL_STRING:
+            }
+            case POOL_FIELD: {
+                Klass holder = readPoolObject(Klass.class);
+                String name = readPoolObject(String.class);
+                String fType = readPoolObject(String.class);
+                int flags = readInt();
+                obj = new Field(fType, holder, name, flags);
+                break;
+            }
+            case POOL_SIGNATURE: {
+                int argc = readShort();
+                String[] args = new String[argc];
+                for (int i = 0; i < argc; i++) {
+                    args[i] = readPoolObject(String.class);
+                }
+                String returnType = readPoolObject(String.class);
+                obj = new Signature(returnType, args);
+                break;
+            }
+            case POOL_STRING: {
                 obj = readString();
                 break;
+            }
             default:
                 throw new IOException("unknown pool type");
         }
@@ -402,15 +564,15 @@
     private Group parseGroup(Folder parent) throws IOException {
         String name = readPoolObject(String.class);
         String shortName = readPoolObject(String.class);
-        byte[] bytecodes = readPoolObject(byte[].class);
+        Method method = readPoolObject(Method.class);
         int bci = readInt();
         Group group = new Group(parent);
         group.getProperties().setProperty("name", name);
-        final InputMethod method = new InputMethod(group, name, shortName, bci);
-        if (bytecodes != null) {
-            method.setBytecodes("TODO");
+        if (method != null) {
+            InputMethod inMethod = new InputMethod(group, method.name, shortName, bci);
+            inMethod.setBytecodes("TODO");
+            group.setMethod(inMethod);
         }
-        group.setMethod(method);
         return group;
     }
     
@@ -451,17 +613,23 @@
 
     private void parseNodes(InputGraph graph) throws IOException {
         int count = readInt();
+        Map<String, Object> props = new HashMap<>();
         List<Edge> edges = new LinkedList<>();
         for (int i = 0; i < count; i++) {
             int id = readInt();
             InputNode node = new InputNode(id);
             final Properties properties = node.getProperties();
             NodeClass nodeClass = readPoolObject(NodeClass.class);
+            int preds = readByte();
+            if (preds > 0) {
+                properties.setProperty("hasPredecessor", "true");
+            }
             int propCount = readShort();
             for (int j = 0; j < propCount; j++) {
                 String key = readPoolObject(String.class);
                 Object value = readPropertyObject();
                 properties.setProperty(key, value != null ? value.toString() : "null");
+                props.put(key, value);
             }
             int edgesStart = edges.size();
             int suxCount = readShort();
@@ -474,21 +642,30 @@
             for (int j = 0; j < inputCount; j++) {
                 int in = readInt();
                 int index = readShort();
-                edges.add(new Edge(in, id, (char) j, nodeClass.inputs.get(index), true));
+                edges.add(new Edge(in, id, (char) (preds + j), nodeClass.inputs.get(index), true));
             }
-            properties.setProperty("name", createName(edges.subList(edgesStart, edges.size()), properties, nodeClass.nameTemplate));
+            properties.setProperty("name", createName(edges.subList(edgesStart, edges.size()), props, nodeClass.nameTemplate));
             properties.setProperty("class", nodeClass.className);
+            switch (nodeClass.className) {
+                case "BeginNode":
+                    properties.setProperty("shortName", "B");
+                    break;
+                case "EndNode":
+                    properties.setProperty("shortName", "E");
+                    break;
+            }
             graph.addNode(node);
+            props.clear();
         }
         for (Edge e : edges) {
-            char fromIndex = e.input ? 0 : e.num;
+            char fromIndex = e.input ? 1 : e.num;
             char toIndex = e.input ? e.num : 0;
             graph.addEdge(new InputEdge(fromIndex, toIndex, e.from, e.to, e.label));
         }
     }
     
-    private String createName(List<Edge> edges, Properties properties, String template) {
-        Pattern p = Pattern.compile("\\{(p|i)#(.+)\\}");
+    private String createName(List<Edge> edges, Map<String, Object> properties, String template) {
+        Pattern p = Pattern.compile("\\{(p|i)#([a-zA-Z0-9$_]+)(/(l|m|s))?\\}");
         Matcher m = p.matcher(template);
         StringBuffer sb = new StringBuffer();
         while (m.find()) {
@@ -509,9 +686,26 @@
                     result = inputString.toString();
                     break;
                 case "p":
-                    result = properties.get(name);
-                    if (result == null) {
+                    Object prop = properties.get(name);
+                    String length = m.group(4);
+                    if (prop == null) {
                         result = "?";
+                    } else if (length != null && prop instanceof LengthToString) {
+                        LengthToString lengthProp = (LengthToString) prop;
+                        switch(length) {
+                            default:
+                            case "l":
+                                result = lengthProp.toString(Length.L);
+                                break;
+                            case "m":
+                                result = lengthProp.toString(Length.M);
+                                break;
+                            case "s":
+                                result = lengthProp.toString(Length.S);
+                                break;
+                        }
+                    } else {
+                        result = prop.toString();
                     }
                     break;
                 default:
--- a/src/share/tools/IdealGraphVisualizer/Graal/src/com/sun/hotspot/igv/graal/filters/color.filter	Tue Jul 10 15:02:41 2012 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Graal/src/com/sun/hotspot/igv/graal/filters/color.filter	Wed Jul 11 14:13:38 2012 +0200
@@ -9,4 +9,7 @@
 colorize("name", "Comp .*", yellow);
 colorize("name", "Virtual.*", green);
 
-colorize("notInOwnBlock", "true", red);
\ No newline at end of file
+colorize("name", "ValuePhi.*|ValueProxy", magenta);
+colorize("name", "Const.*", new java.awt.Color(0.7, 0.7, 0.7));
+colorize("name", "Local.*", new java.awt.Color(0.85, 0.85, 0.85));
+colorize("stamp", "Condition", yellow);
\ No newline at end of file
--- a/src/share/tools/IdealGraphVisualizer/Graal/src/com/sun/hotspot/igv/graal/filters/noframestate.filter	Tue Jul 10 15:02:41 2012 +0200
+++ b/src/share/tools/IdealGraphVisualizer/Graal/src/com/sun/hotspot/igv/graal/filters/noframestate.filter	Wed Jul 11 14:13:38 2012 +0200
@@ -1,1 +1,2 @@
-remove("class", "FrameState");
\ No newline at end of file
+remove("class", "FrameState");
+remove("class", "Virtual.*");
\ No newline at end of file